2015-01-13 2 views
0

Я пытаюсь заставить пользователя ввести некоторые данные, а затем сохранить их в структуре, однако у меня возникают проблемы, зная, какую функцию я должен использовать, и какая разница? cin или getline()? Любая функция, которую я использую, кажется, что она берет ключ «\ n» и заставляет мою программу сбой, но я не 100%, если это проблема ... Так как она продолжает сбой.C++ пропускает новый ключевой ключ?

Я играл с ними обоими, и вот что у меня есть.

string temp; 
int id; 

cout << endl << "Full name (last, first): "; 
cin >> temp; 
cin.ignore(1, '\n'); 
myData[fileSize] = parseName(temp); 

cout << endl << "ID: "; 
cin >> id; 
myData[fileSize].id = id; 

cout << endl << "Address: "; 
cin >> temp; 
temp.copy(myData[fileSize].address, temp.length(), 0); 

Переменная FileSize просто какой элемент массива находится в настоящее время, а функция ParseName разделяет имя в последний и первый.

Я читал несколько функций, таких как cin.ignore() и noskipws, но не знал, как их использовать. Кстати, способ ввода данных пользователем «последний, первый» с запятой и пробелом после (это то, что ищет функция синтаксического анализа).

Также я не уверен, является ли адресная область лучшим способом для этого, у меня есть структура myData.address как массив символов, потому что я не знаю, как работать со строками. Я все еще не уверен в C++. Спасибо за любую помощь.

EDIT: если я прокомментирую части идентификатора и адреса, программа проведет 6-ти циклов, указав, что у меня есть недопустимая запись (которая является частью основного), поэтому она читает 6 или 7 клавиш после нажатия кнопки ввода. Если я оставлю все так, как есть, это то, что я получаю.

Full name (last, first): terminate called after throwing an instance of 'std::ou 
t_of_range' 
    what(): basic_string::copy 

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 

Process returned 3 (0x3) execution time : 4.328 s 
Press any key to continue. 
+1

Что происходит, когда он падает? Сделайте это [MCVE] (http://stackoverflow.com/help/mcve), пожалуйста. – ryanpattison

+1

Откуда вы знаете, что он рушится из-за переходов? Вы тестировали парсинг и все остальное? Попробуйте изолировать свои проблемы. На мой взгляд, у вас есть 3 места, которые могут взорваться. Также есть руководство, как написать «Почему мой код не работает». – luk32

+1

Убедитесь, что на вашем адресе достаточно места для хранения адреса, который вы пытаетесь скопировать на него. – user2970916

ответ

0

Для этого случая необходимо использовать cin.getline(), а cin.ignore не требуется.

Here is an examination of the two methods -std::cin.getline() vs. std::cin

Кроме того, проверить функцию ParseName и попробуйте протестировать его в изоляции без пользовательского ввода/вывода.

+0

Я проверил разбор по hardcoding в имени, и он работает. Как мне избавиться от ключа \ n? Потому что все до этого у меня есть сообщение cout, если вы хотите добавить контакт, и пользователь должен нажать клавишу «Y», и я предполагаю, что новая строка перед этой функцией является причиной того, что она вызывает урод , Я говорю это, потому что, немного изменив код, когда я нажимаю «Y», чтобы добавить контакт, он пропускает имя над добавочной частью имени и возвращается к исходному циклу (все это, в то время как адрес и идентификатор закомментированы) , – Maty

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