Я учусь о классах в 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();
}
Обратите внимание, что в третьей строке я должен использовать два метода, чтобы получить пользовательский ввод. Если я использую один получает
это выход. Это просто пропускает оператор get. Аналогично в других местах я также должен использовать два оператора getchar. Я смог найти ответ на этот вопрос на самом SO. бывший Почему мой проф. использует два getchar. Я не мог найти ответ для двух заявлений get, все же. Вот полный код в случае, если это требуется.
Это потому, что у вас есть трейлинг new line
(от Войти) символ, оставшийся в потоке, который не читается первой операцией чтения. Итак, первый 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
, Тогда у вас не будет таких проблем.
если вы хотите прочитать разделенные пробелами входы в одну строку, используйте станд :: GetLine (как я сделал для мусора выше)
std::getline(cin,book_name);
cin
а также cout
из <iostream>
и получает от <cstdio>
, Не стоит смешивать эти два, если вы точно не знаете, как эти два работают и в чем разница.
Лучшей идеей является использование cin.getline()
cin.getline(char* s, streamsize n );
Второй параметр — это максимальная длина ввода.