2

我正在学习 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 来获取用户输入。如果我使用一个得到 这是输出。它只是跳过了gets语句。同样在其他地方我也必须使用两个 getchar 语句。我能够在 SO 本身上找到答案。前为什么我的教授。正在使用两个 getchar。不过,我找不到两个 get 语句的答案。如果需要,这是完整的代码

4

2 回答 2

3

那是因为您在流中剩余一个尾随new line(from 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);
于 2013-05-05T11:07:30.067 回答
1

cinand coutare from<iostream>和 get 来自<cstdio>. 如果您不完全了解这两者是如何工作的以及有什么区别,那么将这两者混合并不是一个好主意。

更好的主意是使用cin.getline()

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

第二个参数是输入的最大长度。

于 2013-05-05T11:13:35.397 回答