在C中发出清除输入流

时间:2017-06-13 15:26:34

标签: c buffer fflush

我最近开始学习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)的问题,但我已经阅读了答案,似乎无法找出对我有用的任何内容。

2 个答案:

答案 0 :(得分:2)

fflush(stdin);是未定义的行为。

Per the C Standard:

  

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()期望两个整数由逗号和可能的空格分隔。