我正在学习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();
}
注意在第三行我必须使用两个gets来获取用户输入。如果我用一个得到 this is the output. It just skips the gets statement.同样在其他地方我也必须使用两个getchar语句。我能够在SO本身找到答案。前Why my prof. is using two getchar。但是,我无法找到两个获取声明的答案。如果需要,请Here is the complete code。
答案 0 :(得分: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);
答案 1 :(得分:1)
cin
和cout
来自<iostream>
,来自<cstdio>
。如果你不完全知道这两者是如何工作的,那么把它们混合起来并不是一个好主意。
更好的想法是使用cin.getline()
cin.getline(char* s, streamsize n );
第二个参数是输入的最大长度。