2015-01-08 80 views
0

因此,我從包含許多不是唯一單詞的文本文件中讀取每個單詞。我應該找到的唯一字的數量和那些話存入詞叫在C中插入一個單詞(char [])到一個結構詞(char [])中使用C

我的主要問題是在註釋標記的結構變量「我的問題是在這裏下面的」

結構代碼:

typedef struct { 
    char word[101]; 
    int freq; 

    } WordArray; 

代碼:

//temp[i].word is a temporary structure that scans ALL words 
    //input[i].word is the structure with unique words 

    word = fscanf(finput, "%s", &temp[i].word); 

//if the word in temp[i] is in input[j].word then it is not unique 
// so frequency of word is incremented 

    for(j = 0; j < 200; j++) { 
    if(strcmp(temp[i].word,input[j].word) == 0){ 
     contains = 1; 
     input[j].freq++; 
    } 
    } 

    // MY PROBLEM IS HERE BELOW 
    if(contains != 1) { // since contains is not 1 then it is unique 

    input[i].word = temp[i].word // i want to put this word in input[i].word but this 
            // produces incompatible type error 
            // i tried strcpy and strncpy no luck... 
    input[i].freq++; 
    uniqueWords++; 
    } 

回答

2

取出&

fscanf(finput, "%s", &temp[i].word); 

它變化到

fscanf(finput, "%s", temp[i].word); 

或採取的第一個元素,其等同於前一行

fscanf(finput, "%s", &temp[i].word[0]); 

傳遞的數組衰減到的指針的第一個元素的地址陣列,所以這些都是等效

fscanf(finput, "%s", temp[i].word); /* passed a pointer to the first elemn */ 
fscanf(finput, "%s", &temp[i].word[0]); /* passed the address of the first element */ 

還添加一個限制fscanf以防止緩存器溢出這樣

fscanf(finput, "%100s", temp[i].word); /* passed a pointer to the first elemn */ 

其中數字應比數組大小1更少。

您不能分配到陣列本線

input[i].word = temp[i].word 

是不對的,你應該使用strcpy

strcpy(input[i].word, temp[i].word); 
+0

當我用你的fscanf替換我仍然得到錯誤「錯誤:不兼容的類型時,分配到typ e'char [101]''char *'「 – geforce

+1

'你得到那個錯誤的行,你有'temp [i] .word = something;'? –

+0

但當我替換其他行,我有問題與「輸入[我] .word [0] =臨時[我]。字[0];「它的作品,但顯然這不會工作,當我想要存儲在這個數組中的所有單詞 – geforce

0

這條線:

word = fscanf(finput, "%s", &temp[i].word); 

真的應該更喜歡:

if(1 != fscanf(finput, " %100s", temp[i].word)) 
{ // fscanf failed 
    perror("fscanf failed"); 
    exit(EXIT_FAILURE); 
} 

// implied else, fscanf successful 
+0

爲什麼發表兩個答案?選擇一個,添加相關的內容,然後可以刪除其他內容。 – ryyker

0
typedef struct { 
    char word[101]; 
    int freq; 
} WordArray; 

這只是掩蓋了代碼,使之更難以閱讀/理解/維護,更好的使用:

#define MAX_WORDS (200) 
#define MAX_WORD_LEN (100) 

struct WordArray 
{ 
    char word[MAX_WORD_LEN+1]; 
    int freq; 
}; 

struct WordArray input[MAX_WORDS]; 

對於文字閱讀,計數重複:

int numWords = 0; 
    BOOL dupFound = false; 
    char tempWord[101]; 

    // prep save area 'input[]' 
    memset(input, 0x00, sizeof(input)); 

    // prep for first iteration through while loop 
    memset(tempWord, 0x00, sizeof(tempWord)); 

    // note leading ' ' in format string 
    // note sizing of input to avoid buffer overrun 
    while(1 != fscanf(finput, " %[MAX_WORD_LEN]s", tempWord)) 
    { 

     dupFound = false; 
     for j = 0;j<MAX_WORDS;j++) 
     { 
      if(0 == strcmp(tempWord, input[j].word)) 
      { // then dup word found 

       input[j].freq++; 
       dupFound = true; 
       break; 
      } // end if 
     } // end for 


     if(!dupFound) 
     { // then, add new word 

      strcpy(input[numWords].word, tempWord); 
      input[numWords].freq = 1; 
      numWords++; 
     } // end if 

     // prep for next iteration of while loop 
     memset(tempWord, 0x00, sizeof(tempWord)); 
    } // end while 

比較應該是: