2013-05-18 1 views
0

В созданной мной программе мне нужно получить некоторую информацию о клиенте в массиве. Ниже приведены коды, касающиеся моего вопроса.Как получить набор слов с пробелами как один вход в C?

struct CustomerType 
{ 
    string fName; 
    string lName; 
    char gender; 
    string address; 
    string contactNo; 
}; 

CustomerType Customer[1000]; 

У меня есть следующий код для ввода данных пользователем. Здесь i - это индекс клиента, о котором я получаю информацию.

string add=""; 
cout<<left<<"\n"<<setw(29)<<"\t\t Name"<<": "; 
    cin>>Customer[i].fName>>Customer[i].lName; 
cout<<left<<"\n"<<setw(29)<<"\t\t Gender"<<": "; 
    cin>>Customer[i].gender; 
cout<<left<<"\n"<<setw(29)<<"\t\t Address"<<": "; 
    getline(cin,add); Customer[i].address=add; 
cout<<left<<"\n"<<setw(29)<<"\t\t Contact No."<<": "; 
    cin>>Customer[i].contactNo; 

Но когда я запускаю программу, она запрашивает только имя, пол и контакт. но не адрес. Он работает так, как будто нет команды getline.

Как исправить это?

+1

http://stackoverflow.com/search?q=+%5Bc%2B%2B%5D+getline+skipping – chris

+0

Ваш код будет проще прочитайте, если вы использовали пробелы, окружающие операторов. BTW, время, сохраненное во время компиляции не используемых пробелов, очень незначительно. –

+0

Я рекомендую вам добавить функциональность в структуру для чтения ее членов. Ваш код будет выглядеть как 'cin >> Customer [i];'. –

ответ

1

Это старая проблема, если «getline doens't пропускает новую строку на входе, но operator >> делает» проблему. Простые решения включают:

  1. Используйте cin.ignore(1000, '\n');, чтобы пропустить следующую строку новой строки (при условии, что перед символом новой строки должно быть менее 1000 символов). Эта строка идет до вызова getline.
  2. Используйте только getline для чтения данных в целом, а затем используйте другие методы для считывания фактического содержимого. [В вашем случае единственное, что несколько сложно, это переменная-член gender, но вы, вероятно, хотите иметь дело с кем-то, пишущим «Женщина», а затем адрес становится «emale» каким-то образом, так что это может не быть большой проблемой.
+0

Спасибо, что помогли мне. Где я должен поставить 'cin.ignore (1000, '\ n');' в коде? –

+0

Как насчет 'cin >> std :: ws;'? – dyp

+0

@ DishonMichael Отредактировано для объяснения, где это происходит (до getline, после ввода '>>') –

0

Вам необходимо очистить буфер после использования cin, если вы используете getline после него. Если вы этого не сделаете, команда getline попытается прочитать буфер и получить «конец», оставшийся от cin, и автоматически использовать его для своего ввода.

Вы можете сделать это, просто положив cin.ignore(); перед getline(); Или используйте fflush (stdin), как вы бы использовали в C.