C ++ cin奇怪的行为

时间:2013-06-09 02:07:24

标签: c++ iostream cout cin

我有以下代码:

    int data = 0;
    cout << "Enter a number: ";
    cin >> data;
    cout << "You entered " << data << endl;

    string str;
    cout << "Enter a string: ";
    getline(cin,str);
    cout << "Your entered " << str << endl;

收到第一个提示后,我输入了一个有效数字10.但是一旦我点击返回,程序输出:

你输了10 输入字符串:您输入的

换句话说,它没有要求输入第二个字符串。发生了什么事?

由于

4 个答案:

答案 0 :(得分:2)

std::cin >> data;

当您输入data的数字,然后按 Return 键提交输入时,将在流中插入一个新行。新行是输入流的默认分隔符,当使用std::getline(std::cin, str)时,编译器将看到流中已有新行,并且它将停止运行。要解决此问题,您需要使用std::cin.ignore 忽略违规字符:

std::cin.ignore();
std::getline(std::cin, str);

答案 1 :(得分:1)

在输入流上混合数字和字符串的经典问题。对两者使用getline并使用stringstream进行解析。

答案 2 :(得分:0)

查看以下内容。问题是读取整数不会在终止换行符中读取。当您使用getline(...)并且程序退出时,会消耗该换行符。您需要先使用该换行符。

int data = 0;
cout << "Enter a number: ";
cin >> data;
cout << "You entered " << data << endl;

string str;
cout << "Enter a string: ";
getline(cin,str); // consume endline <------------------
getline(cin,str);
cout << "Your entered " << str << endl;

答案 3 :(得分:0)

当你输入10时,你真的输入“10 \ n”,10加上新行。它可能取决于操作系统,但是发生了什么的基本思路是cin只是从输入缓冲区读取10,并留下换行符。然后当你的程序到达getline部分时,getline会从输入缓冲区中读取“\ n”。由于“\ n”是getline的默认终止字符,因此getline完成并且您的程序继续运行。

因此,在程序结束时,str只包含“\ n”。