Getline 在 fflush 后不起作用

getline doesn't work after fflush

本文关键字:不起作用 fflush Getline      更新时间:2023-10-16
#include <iostream>
#include <string>
using namespace std;
int main(){
    int num;
    string str;
    cout << "Input an integer a= ";
    cin >> num;
    cout << num << endl;
    cout << "Input a string str= ";
    fflush(stdin);
    getline(cin,str);
    cout << str << endl;
    cout << "End program" << endl;
    return 0;
}

输出:

Input an integer a= 1
1
Input a string str= 
End program

fflush() 之后的getline不起作用。

fflush(stdin)是未定义的行为,因为 fflush() 的行为仅针对输出流定义。此外,这是一个"C 样式"函数,不应与C++控制台 I/O 结合使用。

代替 fflush(),您可以通过在上一次 cin 调用后直接添加 cin.get() 来丢弃换行符:

cin >> num;
cin.get();

当程序提示您"输入整数 a= "时,键入 1 并输入,因此在 cin >> num; 之后,流中保留一个换行符。然后将新行分配给str。这就是为什么你认为fflush之后的getline(正如Lundin的回答所说,fflush(stdin)是未定义的行为)不起作用。

getline之前使用cin.ignore(A_BIG_NUM, 'n');可忽略新行。