我最近开始学习C,在尝试制作一个简单的计算器时,我在尝试清除输入流时遇到了一个问题。我尝试使用#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;
}
,但很明显,它没有做任何事情。
操作系统:macOS Sierra(版本10.12.5(16F73))
Apple LLVM版本8.1.0(clang-802.0.42)
使用的编辑器:Sublime Text 3
这是我的代码:
$ ./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);
我知道问题是由于输入<{1}}中的数字后输入键存储在输入缓冲区中
然后scanf("%c", &opr);
使用这个存储的输入键(在缓冲区中)作为输入来创建问题(即:我所定义的switch
中的所有情况都不起作用默认情况下运行,所有这些甚至没有我能够进入运营商)
在尝试新的字符输入之前,我尝试使用fflush(stdin);
,但它似乎无效。
当我尝试在Windows系统中运行此代码时,fflush(stdin);
正在运行,但无论我使用哪种编辑器,它都无法在macOS上运行(尝试使用Sublime Text 3和Visual工作室代码)
任何人都可以帮助我解决fflush(stdin);
可能无法正常工作的原因。
此外,我在互联网上阅读了它,一个解决方案是使用cin.get();
而不是getchar();
。我尝试过,但这不起作用。我不想交换这两个代码(如上所述),因为那将是命中和审判。我想以相同的顺序运行代码(首先输入数字然后输入运算符)
另外,我之前已经问过有关fflush(stdin)
的问题,但我已经阅读了答案,似乎无法找出对我有用的任何内容。
答案 0 :(得分:2)
fflush(stdin);
是未定义的行为。
7.21.5.2
fflush
功能...
如果
stream
指向输出流或更新流 最近的操作没有输入,fflush
函数导致传递该流的任何未写入数据 要写入文件的主机环境; 否则, 行为未定义。
答案 1 :(得分:1)
换行符
要删除缓冲区中剩余的(仅)换行符('\n'
),请在格式字符串space
中引入(' ')
scanf()
。该指令与任何no空格(即使zero
)匹配。
scanf(" %c", &opr);
或者您可以在需要时使用getchar()
阅读'\n'
,从而为缓冲区留下无字符。
现在,只要您正确输入输入,代码就能正常工作。
如果缓冲区中剩余多个字符(由于任何原因),请使用以下代码刷新i / p流。
刷新stdin
要刷新输入流,请尝试以下方法之一。
scanf("%*[^\n]");
getchar();
或
int ch;
while((ch = getchar()) != '\n' && ch != EOF);
只有当您确定缓冲区不为空时才使用它,否则在任何一种情况下代码都需要/提示输入。
的 scanf()的强>
scanf("%d, %d", &num1, &num2);
除非你故意写下','
并且空格(' '
)是多余的。如果是这种情况scanf()
期望两个整数由逗号和可能的空格分隔。