这是我的算法,用于计算没有多个空格的单词:
int main(){
char str[300];
int i=0,words=0;
gets(str);
for(i=0; str[i] != '\0'; i++){
if(str[i] != ' ' && str[i] != '\t'){
words++;
while(str[i] != ' ' && str[i] != '\t')
i++;
}
}
printf("number of words = %d",words);
}
我想以这种方式对其进行转换,它将与文件中的第一行文本一起使用,所以我尝试了这个:
FILE *fr;
int i=0,words=0;
fr=fopen("myfile.txt","r")
for(i=0; (i=getc(fr) != '\n'); i++){
if(i != ' ' && i != '\t'){
words++;
while(i != ' ' && i != '\t')
i++;
}
}
printf("number of words = %d",words)
但它不起作用,它还用空格计算所有字符。我在myfile.txt的第一行是“祝你有愉快的一天”,我希望结果等于4.感谢您的建议。
答案 0 :(得分:2)
当输入至少一个单词时,您的代码具有未定义的行为:嵌套循环
while(str[i] != ' ' && str[i] != '\t')
i++;
}
忽略null终止符,并继续读取,直到找到空格或制表符。这有可能经过缓冲区的末尾,导致未定义的行为。
要解决此问题,请添加支票str[i] != '\0'
:
while(str[i] != '\0' && str[i] != ' ' && str[i] != '\t')
i++;
}
您的第二个代码段是完全错误的:不是逐行读取文件到缓冲区并运行算法,而是逐个字符地读取它,然后递增您获得的字符代码。这不会产生预期的结果。更改代码以逐行读取文件,并修复嵌套循环以解决缓冲区溢出问题,如上所述。
注意:将gets(str)
替换为fgets(str, sizeof(str))
以避免缓冲区溢出。
答案 1 :(得分:0)
在你的第二个算法中,在while()循环中,你增加i,实际上它是你的流中的一个字符,并且没有从流中获得更多的字符。所以你根本就没有在字符串中前进。