在C ++中使用两个gets()

时间:2013-05-05 11:01:58

标签: c++ 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();
}

注意在第三行我必须使用两个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

2 个答案:

答案 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)

cincout来自<iostream>,来自<cstdio>。如果你不完全知道这两者是如何工作的,那么把它们混合起来并不是一个好主意。

更好的想法是使用cin.getline()

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

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