我是C的新手。我正在尝试从包含大量非字母字符的文件中读取单词。我的输入文件看起来像这个%tOm12%64ToMmy%^$$6
,我想首先读取tom然后将tom放入我的数据结构中然后读取tommy并将其放在我的数据结构中全部用小写字母表示。这是我迄今为止所尝试过的。我的所有其他代码都工作,因为我手动将参数发送到方法,没有错误。这是我试图从文件中读取的文字。一个单词最多可以包含100个字符。有人可以帮助我理解逻辑和可能的代码。我很失落。谢谢你!
void read(FILE *fp)
{
FILE *fp1 = fp;
char word[100];
int x;
int counter = 0;
while ((x = fgetc(fp1)) != EOF)
{
if (isalpha(x) == 0)
{
insert(&tree,word);
counter = 0;
}
if (isalpha(x) != 0)
{
tolower(x);
word[counter] = x;
counter++;
}
}
rewind(fp1);
fclose(fp1);
}
答案 0 :(得分:2)
char *getWord(FILE *fp){
char word[100];
int ch, i=0;
while(EOF!=(ch=fgetc(fp)) && !isalpha(ch))
;//skip
if(ch == EOF)
return NULL;
do{
word[i++] = tolower(ch);
}while(EOF!=(ch=fgetc(fp)) && isalpha(ch));
word[i]='\0';
return strdup(word);
}
void read(FILE *fp){
char *word;
while(word=getWord(fp)){
insert(&tree, word);
}
//rewind(fp1);
fclose(fp);
}
答案 1 :(得分:1)
这是@BLUEPIXY答案的简化。它还检查word []
的数组边界char *getword(FILE *fp)
{
char word[100];
int ch;
size_t idx ;
for (idx=0; idx < sizeof word -1; ) {
ch = fgetc(fp);
if (ch == EOF) break;
if (!isalpha(ch)) {
if (!idx) continue; // Nothing read yet; skip this character
else break; // we are beyond the current word
}
word[idx++] = tolower(ch);
}
if (!idx) return NULL; // No characters were successfully read
word[idx] = '\0';
return strdup(word);
}