getchar — использование двух gets () в переполнении стека

Я учусь о классах в 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, все же. Вот полный код в случае, если это требуется.

2

Решение

Это потому, что у вас есть трейлинг 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);
3

Другие решения

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

Лучшей идеей является использование cin.getline()

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

Второй параметр — это максимальная длина ввода.

1

По вопросам рекламы [email protected]