为什么fflush(stdin)对输出没有影响?

时间:2019-11-03 11:14:49

标签: c++

我写了这个简单的加法软件,我希望在用户输入'n'时结束加法。我当前的代码工作正常。但是我又对同一代码进行了两种修改,一种可行,一种给了我一个错误。谁能告诉我在每种情况下到底发生了什么?

int a, b=0;
    cout<<"Welcome to my Addition Software!!\n\n";
    do{
        cin>>a;
        b+=a;
    }while(getchar()!='n');
    cout<<b;
    //works just fine
    int a, b=0;
    cout<<"Welcome to my Addition Software!!\n\n";
    do{
        fflush(stdin);
        cin>>a;
        b+=a;
    }while(getchar()!='n');
    cout<<b;
    //this one works too
int a, b=0;
    cout<<"Welcome to my Addition Software!!\n\n";
    do{
        a=getchar();
        b+=a;
    }while(a!='n');
    cout<<b;
    //doesn't work

我想知道为什么fflush(stdin)对代码没有影响。如果我只写“ 20、30、50,n”之类的输入,而不是“ 20,y,30,y,50,n”之类的输入,那么在两个工作代码中我​​将得到相同的结果。为什么会这样?

1 个答案:

答案 0 :(得分:0)

首先,最好分别使用C ++标准输入和输出std::cinstd::cout

您的代码的主要问题是它与您想要的类型冲突:

您想将整数int加在一起,并查看输入的字符是否为char 'n'

正在发生的是传统C fflush(stdin)“冒充”或清除了标准输入流缓冲区(此处更多信息:https://www.google.com/amp/s/www.geeksforgeeks.org/use-fflushstdin-c/amp/),getchar()接收到来自用户的字符输入。 getchar()返回一个字符,并通过推导将您的代码转换为输入到其整数int ASCII-ANSI数值整数等效项中。

这意味着在第三个版本中,当您输入“ 30”时,实际收集的是“ 3”,而没有刷新缓冲区,则认为下一个输入是“ 0”,这会导致问题。

我建议您使用一种控制结构来检查用户是否要在接收到要添加的输入之前继续:

int a = 0, b =0;
char c = 0; // for y/n responses
std::cout << "Welcome to my ... "; //just finish this string
do{
std::cout << "input integer: "; // for better formatting leave at least one space after the colon
std::cin >> a;
b += a;
std::cout << "Continue? n to stop: "
std::cin >> c;
} while (c != 'n')
std::cout << "Added: " << b;