无法理解litlle代码的错误(getline())

时间:2016-09-04 21:17:44

标签: c++

我对此感到有点惭愧,但实际上我无法看到这段代码无法正常使用。现在它应该只存储一些书名(因此数组和getline()),第一个cin表示我将存储多少书名。但我不知道为什么,如果我为N输入nbBooks个号码,我只能输入N-1本书名称和library[0](最后一本书)进入)只是一个空间。

#include <iostream>

using namespace std;

int main()
{
    int nbBooks;
    cin >> nbBooks;
    string library[nbBooks];
    while(nbBooks--) {
        getline(cin, library[nbBooks]);
    }
    cout << library[0];
    return 0;
}

我知道必须有getline()的内容,但即使我确实搜索过这方面的答案,我也找不到。

3 个答案:

答案 0 :(得分:1)

数组在编译时必须具有特定大小而不是在运行时。 此代码将发出错误标志:“错误C2133:'库':未知大小” 如果要分配一个在运行时分配大小的数组,那么:

使用内存HEAP:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int nbBooks;

    cout << "nBooks: ";
    cin >> nbBooks; // nBooks is not defined until runtime
    cout << endl;

    cin.sync(); // flushing the input buffer

    string* library = new string [nbBooks]; // allocating pointer to array on the heap memory not the stack
    int i = 0;

    while(nbBooks--) 
    {
        cout << "library[" << i << "]: ";
        getline(cin, library[i]);
        i++;
        cin.sync(); // flushing again the buffer remeber "safe programming is the purpose of any programmer"
    }

    cout << "library[0]: " << library[0] << endl;

    // now remember memory of heap is not unallocated by the compiler so it must be fred by the programmer

    delete[]library; //dont forget "[]"

    return 0;
}

现在编译代码,一切都会正常工作。

我在cin&gt;&gt;之后立即使用cin.sync() nbooks;确保FLUSHING输入缓冲区。 并且在对元素的任何赋值之后再次在循环内部我使用另一个来确保刷新缓冲区。 我知道getline中有一个错误,它不会完全刷新输入缓冲区,所以有些数据会影响其他变量,为了克服这个问题,我们使用cin.sync()来确保清空缓冲区。

答案 1 :(得分:0)

好吧,我有点困惑:getline()函数之前的一个简单的cin.ignore()使它现在正常工作,而10分钟前同样的事情没有工作(尽管我正在重建和重新编译每个时间)(我向上帝发誓,我不会忘记这一点;))...对不起我的无用问题... 哦顺便说一句:

while(nbBooks--) {...}

它评估值nbBooks,然后递减它,所以这里没问题。

答案 2 :(得分:0)

嗯,问题是\n字符在执行cin >> nbBooks;行后停留在缓冲区中。 operatot>>的{​​{1}}方法默认不接受cin,因此不会从缓冲区中提取换行符。所以,你必须把它拉出来,对吗?只需在\n之后添加cin.get();即可。 cin >> nbBooks;方法将提取get()字符。其余的代码很好。