在C中将一个单词(char [])插入一个结构单词(char [])中

Inserting a word(char[]) into a structure word(char[]) in C

所以我正在从包含许多不唯一单词的文本文件中读取每个单词。我应该找到唯一单词的数量并将这些单词存储到一个名为 word

的结构变量中

我的主要问题在评论下标注了"MY PROBLEM IS HERE BELOW"

结构代码:

  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++;
  }

删除 &

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);

这一行:

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
typedef struct {
    char word[101];
    int  freq;
} WordArray;

那只是模糊了代码,使 read/understand/maintain 更难,更好用:

#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

比较应该是: