2014-01-07 4 views
0

Я знаю, что у меня есть похожие вопросы, но я проверил их много и не нашел ответа, поэтому я надеюсь, что кто-то может мне помочь. Так что я пытаюсь сохранить некоторые строки в массивы, но некоторые из этих строк могут состоять из нескольких слов, поэтому я искал в Интернете и выяснял, что мне нужно использовать cin.ignore() и Getline. Я использовал их, как показано в моем коде ниже, но ошибка происходит во второй и третьей строках, где удаляется первая буква фамилии [0] и адрес [0]. Так почему это?БлагодаряGetline & cin.ignore в C++

Вот мой код:

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; 
    } 

EDIT: Пример ввода/вывода

Пожалуйста, введите число записей

Имя

Джон

Майкл

Daniel

Radu

Фамилия

Laaksonen

Taro

Албот

Smith

Адрес

123 Ларкин Street

900 Ларкин Street

823 Ларкин Street

283 Ларкин Street

** Имя John

Фамилия aaksonen

Адрес 23 Ларкин Street

Имя Michael

Фамилия Taro

Адрес 900 Ларкин Street

Имя Daniel

Су RNAME Албот

Адрес +823 Ларкин Street

Имя Radu

Фамилия Смит

Адрес 283 Ларкин Street **

Жирный является вывод программы. Посмотрите, как L в Laaksonen отсутствует, а 1 в 123 отсутствует.

+0

Можете ли вы показать пример ввода и ожидаемый выход? –

+0

Почему, по-вашему, вам нужно «игнорировать»? Интересно, куда это письмо ушло ...? Также читайте о ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector). – BoBTFish

ответ

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 будет более подходящим.

+0

Спасибо, что сделал это –

0

Альтернативой может быть чтение всех с использованием getline() и разбор целого числа (используя atoi или некоторые такие) самостоятельно, избегая необходимости полностью игнорировать.

Смежные вопросы