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();
}
}
为什么代码在偶数次直接获取空数据?我不知道发生了什么。 非常感谢。
#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();
}
}