C++ 中的 Getline 和 cin.ignore
Posted
技术标签:
【中文标题】C++ 中的 Getline 和 cin.ignore【英文标题】:Getline & cin.ignore in c++ 【发布时间】:2014-01-07 11:44:56 【问题描述】:我知道我有类似的问题,但我查了很多都没有找到答案,所以我希望有人能帮助我。 所以我想做的是将一些字符串存储到数组中,但其中一些字符串可能包含多个单词,所以我在互联网上搜索发现我必须使用 cin.ignore() 和 Getline。我使用了它们,如下面的代码所示,但错误发生在第二个和第三个字符串中,其中删除了 surname[0] 和 address[0] 的第一个字母。那为什么呢?谢谢
这是我的代码:
int size;
cout<<"Please enter the number of entries"<<endl;
cin>>size;
cin.ignore();
string* firstname=new string[size];
string* surname=new string[size];
string* address=new string[size];
cout<<"First Name"<<endl;
for (int i=0;i<size;i++)
getline (cin, firstname[i]);
cout<<"Surname"<<endl;
cin.ignore();
for (int i=0;i<size;i++)
getline (cin, surname[i]);
cout<<"Address"<<endl;
cin.ignore();
for (int i=0;i<size;i++)
getline (cin, address[i]);
for (int i=0;i<size;i++)
cout<<"First Name "<<firstname[i]<<endl;
cout<<"Surname "<<surname[i]<<endl;
cout<<"Age "<<address[i]<<endl;
编辑:示例输入/输出
请输入条目数
4
名字
约翰
迈克尔
丹尼尔
拉杜
姓
拉克索宁
芋头
阿尔伯特
史密斯
地址
拉金街 123 号
拉金街 900 号
拉金街 823 号
拉金街 283 号
**名字约翰
姓氏
地址 23 拉金街
名字迈克尔
姓太郎
地址 900 拉金街
名字丹尼尔
姓阿尔伯特
地址 823 拉金街
名字拉杜
姓史密斯
地址 283 拉金街**
粗体是程序的输出。看看 Laaksonen 中的 L 是如何丢失的,而 123 中的 1 是如何丢失的。
【问题讨论】:
您能显示示例输入和预期输出吗? 你认为你为什么需要ignore
?我想知道那封信去了哪里……?另外,请阅读std::vector
。
【参考方案1】:
getline()
读取并丢弃分隔符 (reference),只有在读取第一个整数时才必须使用 cin.ignore()
:
cout<<"First Name"<<endl;
for (int i=0;i<size;i++)
getline (cin, firstname[i]);
cout<<"Surname"<<endl;
// Remove this: cin.ignore();
for (int i=0;i<size;i++)
getline (cin, surname[i]);
cout<<"Address"<<endl;
// Remove this: cin.ignore();
for (int i=0;i<size;i++)
getline (cin, address[i]);
也就是说你可以避免使用标准数组,std::vector<std::string>> firstNames
会更合适。
【讨论】:
【参考方案2】:另一种方法是使用 getline() 读取所有内容,并自己解析整数(使用 atoi 或类似的东西),避免完全忽略。
【讨论】:
以上是关于C++ 中的 Getline 和 cin.ignore的主要内容,如果未能解决你的问题,请参考以下文章
如何从 C++ 中的 getline 函数中提取特定的子字符串?