C 中的 for 循环和 getchar()

for-loop and getchar() in C

为什么代码在偶数次直接获取空数据?我不知道发生了什么。 非常感谢。

    #include <stdio.h>
    #pragma warning(disable : 4996) 
    
    void main() {
        
        int f, a = 10, b = 20;
        for (int i = 0; i < 5; i++)
        {
            char ch;
            ch = getchar();
            printf("ch = %c\n", ch);
            switch (ch)
            {
                case '+': f = a + b; printf("f = %d\n", f); break;
                case '−': f = a - b; printf("f = %d\n", f); break;
                case '*': f = a * b; printf("f = %d\n", f); break;
                case '/': f = a / b; printf("f = %d\n", f); break;
                default: printf("invalid operator\n"); 
            }
    
        }
    
    }

如果我输入一个运算符,它会循环两次。而第二次是空输入。

假设您输入了 a,然后输入 Enter

第一次调用getchar()returnsa但换行符仍然留在输入流中。下一次调用 getchar() returns 换行符而不等待您的输入。

有很多方法可以解决这个问题。最简单的方法之一是在调用 getchar().

之后忽略该行的其余部分
ch = getchar();

// Ignore the rest of the line.
int ignoreChar;
while ( (ignoreChar = getchar()) != '\n' && ignoreChar != EOF );

您可以将其包装在一个函数中。

void ignoreLine(FILE* in)
{
   int ch;
   while ( (ch = fgetc(in)) != '\n' && ch != EOF );
}

并使用

ch = getchar();

// Ignore the rest of the line.
ignoreLine(stdin);

如果您不想在代码中做太多更改,我建议在 for 循环的末尾插入另一个 getchar 以消耗 '\n':

#include <stdio.h>
#pragma warning(disable : 4996) 

void main() {

    int f, a = 10, b = 20;
    for (int i = 0; i < 5; i++)
    {
        char ch;
        ch = getchar();
        printf("ch = %c\n", ch);
        switch (ch)
        {
            case '+': f = a + b; printf("f = %d\n", f); break;
            case '−': f = a - b; printf("f = %d\n", f); break;
            case '*': f = a * b; printf("f = %d\n", f); break;
            case '/': f = a / b; printf("f = %d\n", f); break;
            default: printf("invalid operator\n"); 
        }
        getchar();

    }

}