计算用户输入中的单词

时间:2019-05-13 08:05:25

标签: c kernighan-and-ritchie

程序无法从while循环while (c != EOF)

中退出

我已经在终端上尝试过

#include <stdio.h>

main() {
    int c = getchar();
    int n = 0;
    while (c != EOF) {
        if (c == ' ') {
            while (c == ' ')
                c = getchar();
        }
        else {
            ++n;
            while (c != ' ')
                c = getchar();
        }

    }
    printf("\n%d", n);
}

它应该显示单词的编号。但是它要求输入后输入

1 个答案:

答案 0 :(得分:4)

  •   

    程序无法从while循环while (c != EOF)

    中退出

    那是因为您没有在内部EOF循环中测试while

    while (c == ' ')
        c = getchar();
    

    〜>

    while (c == ' ' && c != EOF)
        c = getchar();
    
  • 您标记了问题 kernigham-and-ritchie 。我希望您只是在使用这本书,并且不打算同时学习C的标准 *)样式。

  • 缺少main()的返回类型。
  • 当函数在C中不接受任何参数时,其参数列表应为void,因此

    int main(void)
    
  • 我建议你这样做

    int ch;
    while ((ch = getchar()) != EOF) {
        // process ch
    }
    
  • c == ' '
    

    除空格外,还有其他空白。有关字符分类的功能列表,请参见<ctype.h>


示例:

#include <stddef.h>   // size_t
#include <stdbool.h>  // bool, true, false
#include <ctype.h>    // isalnum()
#include <stdio.h>    // getchar(), printf()

int main(void)
{
    size_t num_words = 0;
    bool in_word = false;
    int ch;

    while ((ch = getchar()) != EOF) {
        if (!in_word && isalnum(ch)) {  // new word begins. isalnum() or isalpha()
            in_word = true;             // ... depends on your definition of "word"
            ++num_words;
            continue;  // continue reading
        }
        else if (in_word && isalnum(ch)) {  // still inside a word
            continue;  // continue reading
        }

        in_word = false;  // when control gets here we're no longer inside a word
    }  // when control reaches the end of main() without encountering a return statement
       // the effect is the same as return 0; since C99 *)

    printf("Number of words: %zu\n\n", num_words);
}

为获得更好的变量局部性,也许应首选for循环:

for (int ch; (ch = getchar()) != EOF;)  // ...


*)语言标准:
C99:ISO/IEC 9899:TC3
C11:ISO/IEC 9899:201x(接近最终标准的草案)
C18:ISO/IEC 9899:2017(建议中)