在 C 中发出清除输入流
Issue clearing input stream in C
我最近开始学习 C,在尝试制作一个简单的计算器时,我在尝试清除输入流时遇到了问题。我尝试使用 fflush(stdin);
但显然,它没有做任何事情。
Operating System: macOS Sierra (Version 10.12.5 (16F73))
Apple LLVM version 8.1.0 (clang-802.0.42)
Editor Used: Sublime Text 3
这是我的代码:
#include <stdio.h>
int main()
{
int num1, num2;
char opr;
char choice = 'y';
while (choice == 'y') {
printf("Enter numbers separated with a comma: \n");
scanf("%d, %d", &num1, &num2);
printf("Enter an operator: \n");
fflush (stdin);
scanf("%c", &opr);
switch (opr) {
case '+':
printf("The sum is %ld\n", (long int) num1 + num2);
break;
case '-':
printf("The difference is %ld\n", (long int) num1 - num2);
break;
case '*':
printf("The product is %ld\n", (long int) num1 * num2);
break;
case '/':
printf("The quotient is %ld and the remainder is %ld\n",
(long int) num1 / num2, (long int) num1 % num2);
break;
default:
printf("You've entered an undefined operator\n");
printf("Please enter + - * or /\n");
break;
}
printf("Do you want to repeat? (y/n): \n");
fflush(stdin);
scanf("%c", &choice);
}
return 0;
}
这是终端输出:
$ ./calculator_basic
Enter numbers separated with a comma:
20, 30
Enter an operator:
You've entered an undefined operator
Please enter + - * or /
Do you want to repeat? (y/n):
n
我找到的一个简单的解决方案是简单地交换
的位置
printf("Enter numbers separated with a comma: \n");<br>
scanf("%d, %d", &num1, &num2);
和
printf("Enter an operator: \n");
fflush (stdin);
scanf("%c", &opr);
我了解到问题是由于在 scanf("%d, %d", &num1, &num2);
中输入数字后 enter 键被存储在输入缓冲区中
然后 scanf("%c", &opr);
使用这个存储的 enter 键(在缓冲区中)作为它的输入,这会产生问题(即:[=17= 中的 none 个案例] 由我定义的工作和默认情况 运行s,所有这些甚至我都无法输入运算符)
我在获取新字符输入之前尝试使用 fflush(stdin);
,但它似乎不起作用。
问题是,当我尝试在 Windows 系统中 运行 这段代码时,fflush(stdin);
可以正常工作,但无论我使用何种编辑器,它都无法在 macOS 上运行' m 使用(尝试了 Sublime Text 3 和 Visual Studio 代码)
任何人都可以帮助我了解为什么 fflush(stdin);
可能无法正常工作。
我也在网上读到过它,一种解决方案是使用 cin.get();
而不是 getchar();
。我试过了,但效果不佳。我不想交换这两段代码(上面提到的),因为那会受到打击和审判。我想 运行 相同顺序的代码(先输入数字,然后输入运算符)
此外,我知道之前有人问过关于 fflush(stdin)
的问题,但我已经阅读了答案,但似乎无法找出适合我的任何内容。
fflush(stdin);
是未定义的行为。
7.21.5.2 The fflush
function
...
If stream
points to an output stream or an update stream in
which the most recent operation was not input, the fflush
function causes any unwritten data for that stream to be delivered to
the host environment to be written to the file; otherwise, the
behavior is undefined.
换行符
要删除缓冲区中留下的(唯一的)换行符('\n'
),请在 scanf()
的格式字符串中引入 space
(' ')
。该指令匹配任何白色 spaces(甚至 zero
)。
scanf(" %c", &opr);
或者您可以在需要时使用 getchar()
来读取 '\n'
,从而使缓冲区中没有 个字符。
现在只要输入正确,代码就可以正常运行了。
如果缓冲区中剩余的字符超过一个(出于任何原因),请使用以下代码刷新 i/p 流。
法拉盛stdin
要刷新输入流,请尝试以下方法之一。
scanf("%*[^\n]");
getchar();
或
int ch;
while((ch = getchar()) != '\n' && ch != EOF);
仅当您确定缓冲区不为空时才使用它,否则在任何一种情况下,输入代码 expects/prompts。
scanf()
scanf("%d, %d", &num1, &num2);
除非你是故意写的 ','
和 space (' '
) 是多余的。如果是这种情况,scanf()
期望两个整数由逗号和可能的白色分隔 space(s).
我最近开始学习 C,在尝试制作一个简单的计算器时,我在尝试清除输入流时遇到了问题。我尝试使用 fflush(stdin);
但显然,它没有做任何事情。
Operating System: macOS Sierra (Version 10.12.5 (16F73))
Apple LLVM version 8.1.0 (clang-802.0.42)
Editor Used: Sublime Text 3
这是我的代码:
#include <stdio.h>
int main()
{
int num1, num2;
char opr;
char choice = 'y';
while (choice == 'y') {
printf("Enter numbers separated with a comma: \n");
scanf("%d, %d", &num1, &num2);
printf("Enter an operator: \n");
fflush (stdin);
scanf("%c", &opr);
switch (opr) {
case '+':
printf("The sum is %ld\n", (long int) num1 + num2);
break;
case '-':
printf("The difference is %ld\n", (long int) num1 - num2);
break;
case '*':
printf("The product is %ld\n", (long int) num1 * num2);
break;
case '/':
printf("The quotient is %ld and the remainder is %ld\n",
(long int) num1 / num2, (long int) num1 % num2);
break;
default:
printf("You've entered an undefined operator\n");
printf("Please enter + - * or /\n");
break;
}
printf("Do you want to repeat? (y/n): \n");
fflush(stdin);
scanf("%c", &choice);
}
return 0;
}
这是终端输出:
$ ./calculator_basic
Enter numbers separated with a comma:
20, 30
Enter an operator:
You've entered an undefined operator
Please enter + - * or /
Do you want to repeat? (y/n):
n
我找到的一个简单的解决方案是简单地交换
的位置printf("Enter numbers separated with a comma: \n");<br>
scanf("%d, %d", &num1, &num2);
和
printf("Enter an operator: \n");
fflush (stdin);
scanf("%c", &opr);
我了解到问题是由于在 scanf("%d, %d", &num1, &num2);
中输入数字后 enter 键被存储在输入缓冲区中
然后 scanf("%c", &opr);
使用这个存储的 enter 键(在缓冲区中)作为它的输入,这会产生问题(即:[=17= 中的 none 个案例] 由我定义的工作和默认情况 运行s,所有这些甚至我都无法输入运算符)
我在获取新字符输入之前尝试使用 fflush(stdin);
,但它似乎不起作用。
问题是,当我尝试在 Windows 系统中 运行 这段代码时,fflush(stdin);
可以正常工作,但无论我使用何种编辑器,它都无法在 macOS 上运行' m 使用(尝试了 Sublime Text 3 和 Visual Studio 代码)
任何人都可以帮助我了解为什么 fflush(stdin);
可能无法正常工作。
我也在网上读到过它,一种解决方案是使用 cin.get();
而不是 getchar();
。我试过了,但效果不佳。我不想交换这两段代码(上面提到的),因为那会受到打击和审判。我想 运行 相同顺序的代码(先输入数字,然后输入运算符)
此外,我知道之前有人问过关于 fflush(stdin)
的问题,但我已经阅读了答案,但似乎无法找出适合我的任何内容。
fflush(stdin);
是未定义的行为。
7.21.5.2 The
fflush
function...
If
stream
points to an output stream or an update stream in which the most recent operation was not input, thefflush
function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.
换行符
要删除缓冲区中留下的(唯一的)换行符('\n'
),请在 scanf()
的格式字符串中引入 space
(' ')
。该指令匹配任何白色 spaces(甚至 zero
)。
scanf(" %c", &opr);
或者您可以在需要时使用 getchar()
来读取 '\n'
,从而使缓冲区中没有 个字符。
现在只要输入正确,代码就可以正常运行了。
如果缓冲区中剩余的字符超过一个(出于任何原因),请使用以下代码刷新 i/p 流。
法拉盛stdin
要刷新输入流,请尝试以下方法之一。
scanf("%*[^\n]");
getchar();
或
int ch;
while((ch = getchar()) != '\n' && ch != EOF);
仅当您确定缓冲区不为空时才使用它,否则在任何一种情况下,输入代码 expects/prompts。
scanf()
scanf("%d, %d", &num1, &num2);
除非你是故意写的 ','
和 space (' '
) 是多余的。如果是这种情况,scanf()
期望两个整数由逗号和可能的白色分隔 space(s).