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&lt;std::string&gt;&gt; firstNames 会更合适。

【讨论】:

【参考方案2】:

另一种方法是使用 getline() 读取所有内容,并自己解析整数(使用 atoi 或类似的东西),避免完全忽略。

【讨论】:

以上是关于C++ 中的 Getline 和 cin.ignore的主要内容,如果未能解决你的问题,请参考以下文章

C++ 类中的 Getline

如何从 C++ 中的 getline 函数中提取特定的子字符串?

C++ Getline 并不总是在 Linux 中的多个分叉进程中获得一致

C ++中的getline输入错误[重复]

C ++中的getline()

关于 getline(cin, string) 的 C++ 快速问题