C中的for循环和getchar()

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

#include  #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()返回a但新行仍然保留在输入流中。 下一次调用getchar()返回换行符,而不会等待您的输入。

有很多方法可以解决这个问题。 最简单的方法之一是在调用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  #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(); } }