我有以下代码:
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 输入字符串:您输入的
换句话说,它没有要求输入第二个字符串。发生了什么事?
由于
答案 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”。