计算一行中没有1或更多空格的单词

时间:2014-09-29 20:54:37

标签: c

这是我的算法,用于计算没有多个空格的单词:

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.感谢您的建议。

2 个答案:

答案 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,实际上它是你的流中的一个字符,并且没有从流中获得更多的字符。所以你根本就没有在字符串中前进。