- 此问题在此处已有答案**:
cin and getline skipping input [duplicate](4个答案)
Why does std::getline() skip input after a formatted extraction?(5个答案)
昨天关闭。
#include <iostream>
using namespace std;
int main(){
//set variables
string name1;string name2;string name3;string n1;string n2;string n3;
int age1; int age2; int age3;
//get names and ages
cout << "Who Is The First Student?"<< endl;
getline(cin, name1); //name 1
cout << "What is " << name1<< "'s Age?"<< endl;
cin >> age1; // age 1
cout << "Who Is The Second Student?"<< endl;
getline(cin, name2); //name 2
cout << "What is " << name2<< "'s Age?"<< endl;
cin >> age2; //age 2
cout << "Who Is The Third Student?"<< endl;
getline(cin, name3); // name 3
cout << "What is " << name3<< "'s Age?"<< endl;
cin >> age3; //age 3
// gets modified names
n1 = name1.substr(2, name1.size() -3);
n2 = name2.substr(2, name2.size() -3);
n3 = name3.substr(2, name3.size()-3);
// Output formatting
cout << "Name Age Modified"<<endl;
cout << name1<< " "<<age1<<" "<<n1<<endl;
cout << name2<< " "<<age2<<" "<<n2<<endl;
cout << name3<< " "<<age3<<" "<<n3<<endl;
return 0;
}
输出询问第一个问题,即第一个学生的姓名,但输出如下:
谁是第一个学生?-约翰·多伊-约翰的年龄是多少?-19-谁是第二个学生?-约翰的年龄是多少?-
它跳过了用户输入的第二个学生的名字,并立即询问年龄,但我不知道为什么会发生这种情况,是我的代码有问题还是我有格式不正确?我相信我使用了正确的getline函数,但我可能是不正确的,并没有意识到它被跳过了一个更重要的函数。
2条答案
按热度按时间s5a0g9ez1#
std::string::substr()手册页是这样描述您看到的异常的:
vuktfyat2#
该程序的主要问题是
operator >>
只读取一个字。例如在这些语句中
您输入了包含两个单词
"John Doe"
的字符串。但operator >>
只读取变量name1
中的第一个单词"Jphn"
。在下一个输入语句中
由于输入缓冲器包含字
"Doe"
而不是数字,因此发生错误。因此,变量
name1
、name2
和name3
不包含您所期望的内容。产生运行时错误。
您应该使用标准函数
std::getline
而不是operator >>
。下面是一个基于您的程序代码的演示程序,它显示了错误的原因
程序输出为
正如你所看到的,由于读取变量age1(缓冲区包含字符串
"Doe"
)中的数据时出错,对象name2
为空。则将发生运行时间错误。
下面是另一个演示程序,展示了如何在程序中使用标准函数
std::getline
。程序输出为