C 如何在计数中包含文件的最后一个字

C 如何在计数中包含文件的最后一个字,c,C,我编写了一个简单的程序,可以计算文件中每个单词的长度: length = 0; while ((c = getchar()) != EOF){ ++ length; if (c == ' ' || c == '\n' || c == '\t'){ -- length; printf("length of last word: %d\n", length); length = 0; } } 现在它就这样做,直到最后一句话。

我编写了一个简单的程序,可以计算文件中每个单词的长度:

length = 0;

while ((c = getchar()) != EOF){
    ++ length;
    if (c == ' ' || c == '\n' || c == '\t'){
        -- length;
        printf("length of last word: %d\n", length);
        length = 0;
    }
}
现在它就这样做,直到最后一句话。 我理解它为什么会这样做,因为它只会在到达某种形式的空白处时计算一个单词,而在最后一个单词之后没有任何空白。
所以我想知道如何让这段代码在文件中包含最后一个单词?

一种方法是在循环完成后打印最后一个单词的长度

while ((c = getchar()) != EOF){
    ++ length;
    if (c == ' ' || c == '\n' || c == '\t'){
        -- length;
        printf("length of last word: %d\n", length);
        length = 0;
    }
}
if (length > 0) {
    printf("length of last word: %d\n", length);
}
另一种方法是更改循环条件,并在打印后中断循环

while (1){
    ++ length;
    if (c == ' ' || c == '\n' || c == '\t' || c == EOF){
        -- length;
        printf("length of last word: %d\n", length);
        length = 0;
    }
    if (c == EOF) {
        break;
    }
}
顺便说一句,不是先增加
长度
,然后在
if
块中减小它,而是将增量移动到
else
块中。或者只打印
length-1


++/--
和变量之间加一个空格不是惯用的做法。

你有没有考虑过在到达
EOF
之前数数单词,然后打印计数?也许你应该永远循环,然后把EOF当作一个while空格来处理(也可以中断循环)。如果一行上有一个尾随空格,会发生什么?还是行首的空格?我认为你需要更严格地检测何时在“单词内”和“单词外”之间转换,以及如何进行计数。谢谢你的帮助!在您看来,这两种解决方案中哪一种最像C,或者您会对它们进行同等评价?我正在努力开发良好的格式。@maritsc:在上下文中,另一个选项是
do{c=getchar();if(isspace(c)| | c==EOF){printf(“最后一个单词的长度:%d\n”,长度-1);length=0;}while(c!=EOF)这可能是最像C的。请注意,如果给定一个空文件,您将被告知最后一个单词的长度为零;
while(1)
循环也会发生这种情况。第一个代码避免了这一点——因此,它有自己的优点。基于Barmar的观点和本文的评论,有很多的调整。嘿,谢谢你。我很喜欢你在这里提出的方法,因为它看起来更简洁。我一定要试一试。