while( (ch = fgetc( infile )) != EOF )
if(ch ==' ') words++;
它很好用,但是如果我们在字符串中有空行,我们应该如何检测这些行并将这些行计算正确?
答案 0 :(得分:6)
您的代码不计算单词,它会计算空格。在许多情况下,两个计数会有所不同 - 例如,当单词被多个空格分隔时。
你需要改变逻辑,使你设置一个布尔标志"我在一个单词内#34;当您看到属于某个单词的字符时,当它看到空白字符(空格,制表符或换行符)时具有以下逻辑:
if (isspace(ch)) {
if (sawWordFlag) {
words++;
sawWordFlag = false;
}
}
检测角色是否属于某个单词的一种方法是在其上调用isalnum
。 isalnum
和isspace
函数都要求您包含<ctype.h>
标题。
答案 1 :(得分:2)
所以sscanf
已经做了你需要的东西,它会在包含制表符和换行符的字符串之前占用任意数量的空格。此算法也适用于前导或尾随空格。
int words = 0;
int i = 0;
while(sscanf(inFile, "%*s%n", &i) != EOF){
inFile += i;
words++;
}
sscanf
非常多才多艺,你可以轻松地读出每个单词如下:
int words = 0;
int size = strlen(inFile);
if(size > 0){
char* word = (char*)malloc((size + 1) * sizeof(char));
for(int i = 0; sscanf(sentence, "%s%n", word, &i) > 0; sentence += i){
// Do what you want with word here
words++;
}
free(word);
}
答案 2 :(得分:0)
char prev = 'x'; // anything but space
while((ch == fgetc(infile)) != EOF)
{
if(ch == ' ' && ch == prev)
continue;
else if(ch == ' ' && ch != prev)
words++;
prev = ch;
}