2013-05-05 2 views
2

Я изучаю классы на C++. Я сделал простую программу, используя концепцию классов. В программе мне нужен человек, чтобы ввести детали книги. Вот эта функция:Использование двух get() в C++

void Book::add(){ 
cout << "Enter name of Book: "; 
gets(book_name);gets(book_name); 
cout << "\n\nPlease enter the book id: "; 
cin >> book_id; 
cout << "\n\nThank you the book has been added."; 
total++; 
input = getchar(); 
getchar(); 
} 

Обратите внимание, что в третьей строке я должен использовать два, чтобы получить вход пользователя. Если я использую, то получается this is the output. It just skips the gets statement. Аналогичным образом, в других местах мне также необходимо использовать два оператора getchar. Я смог найти ответ на это сам. Пример Why my prof. is using two getchar. Тем не менее, я не мог найти ответ на два утверждения. Here is the complete code в случае необходимости.

+0

Помните, что 'gets' является функцией C с использованием' stdio'. Не смешивайте поток потока C++ из 'std :: cin' с вводом из C' stdin'. –

+0

Обратитесь к руководству 'gets'. НИКОГДА не используйте его! – KAction

ответ

3

Это потому, что у вас есть трейлинг-код new line (от Enter) символ, оставшийся в потоке, который не читается первой операцией чтения. Поэтому первые gets(book_name) будут читать это и продолжить следующий запрос ввода.

используйте getline, чтобы удалить оставшийся оскорбительный вход из потока.

void Book::add(){ 
    string garbage; 
    getline(cin,garbage); // this will read any remaining input in stream. That is from when you entered 'a' and pressed enter. 
    cout << "Enter name of Book: "; 
    gets(book_name); 
    getline(cin,garbage); // this will read any remaining input in stream. 
    cout << "\n\nPlease enter the book id: "; 
    cin >> book_id; 

Любой просто использовать безопасный способ чтения входных данных из потоков

cin >> book_name; 

вместо gets. Тогда у вас не будет таких проблем.


, если вы хотите прочитать пространства, разделенные входы и одной струны использования std::getline (как я сделал для мусора выше)

std::getline(cin,book_name); 
+0

Я думаю, что вторая строка getline должна быть удалена из вашего кода. С его помощью он не запрашивает book_id после ввода book_name – Vijay

+0

@ Vijay не будет ли остальной символ «новой строки» после того, как пользователь войдет в «book_name» и нажмет enter? – stardust

+0

Правильно, я понимаю. Спасибо за ваш ответ. О вашем редактировании: «cin >> book_name;» принимает только 1 слово многословной строки. Название книги может содержать несколько слов. Вот почему я использовал get – Vijay

1

cin и cout являются от <iostream> и получает приходит от <cstdio> , Не стоит смешивать эти два, если вы точно не знаете, как эти два работают и в чем разница.

Лучше Идея заключается в том, чтобы использовать cin.getline()

cin.getline(char* s, streamsize n); 

Вторым параметром является максимальная длина входных данных.

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

  • Нет связанных вопросов^_^