在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
比较应该是:
所以我正在从包含许多不唯一单词的文本文件中读取每个单词。我应该找到唯一单词的数量并将这些单词存储到一个名为 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
比较应该是: