Getline& cin.ignore in c ++

时间:2014-01-07 11:44:56

标签: c++

我知道我的问题也有类似的问题,但是我检查了很多问题并没有找到答案,所以我希望有人可以帮助我。 所以我想要做的是将一些字符串存储到数组中,但是这些字符串中的一些可能包含多个单词,所以我搜索了互联网,发现我必须使用cin.ignore()和Getline。我使用它们,如下面的代码所示,但错误发生在第二个和第三个字符串中,其中删除了姓[0]和地址[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

名字

约翰

迈克尔

丹尼尔

拉​​杜

Laaksonen

太郎

Albot

史密斯

地址

123 Larkin Street

900 Larkin Street

823 Larkin Street

283 Larkin Street

**名字John

aaksonen姓氏

地址23 Larkin Street

名字迈克尔

Taro姓氏

地址900 Larkin Street

名字丹尼尔

姓氏Albot

地址823 Larkin Street

名字Radu

史密斯姓名

地址283 Larkin Street **

粗体是程序的输出。看看Laaksonen中的L是如何丢失的,123中的1是丢失的。

2 个答案:

答案 0 :(得分:3)

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会更合适。

答案 1 :(得分:0)

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