为什么cin.ignore()忽略我的getline输入的第一个字符?

问题描述 投票:1回答:1

因此,根据Eclipse,getline函数存储流中的整个文本行以及换行符和“终止空字符”。我不完全知道那是什么意思。

我试图获得的输出是使用一个函数打印两个并行数组。此函数是一个void函数,它包含3个参数,第一个数组,第二个数组和常量整数数组大小值。

我能够毫无问题地将输入存储到第一个数组中。

    const int SIZE = 5;
    double firstArray[SIZE];

    // range-based `for` loop to get user input
    for (double& floatNum : firstArray)
    {
        cout << "Enter a floating point number: ";
        cin >> floatNum;
    } 

但是,第二个数组是字符串类型,情况变得很奇怪。

    string secondArray[SIZE];

    // `for` loop to get user input
    for (int i = 0; i < SIZE; i++)
    {
        cout << "Enter a name: ";
        cin.ignore();
        getline(cin, secondArray[i]);
    }

我想要的输出是在main()printParallel(array1, array2, sizeofarray)中使用函数调用同时打印出两个数组,同时在函数内部使用了while循环,我在这里尝试过:

void printParallel(double arrayOne[], string arrayTwo[], const int NUM)
{
    int i = 0;
    while (i < NUM)
    {
        cout << arrayOne[i] << " " << arrayTwo[i] << endl;
        i++;
    }

}

但是输出略有关闭:

Enter a floating point number: 1.23
Enter a floating point number: 1.23
Enter a floating point number: 1.23
Enter a floating point number: 1.23
Enter a floating point number: 1.23
Enter a name: AA AA
Enter a name: AA AA
Enter a name: AA AA
Enter a name: AA AA
Enter a name: AA AA
1.23 AA AA
1.23 A AA
1.23 A AA
1.23 A AA
1.23 A AA

有人可以解释这是怎么回事吗?第一个“ A”似乎被空字符覆盖。另外,为了将来更好地解决问题,我是否应该有更好的方式提出问题?

c++ cin getline
1个回答
0
投票

问题:

cin.ignore(); 循环内

相当于cin.ignore(1);

它忽略了字符串输入的每个第一个字符。因此,所有“ AA AA”都变为“ AA AA”(第一个'A'被cin.ignore()忽略)。

除了第一个“ AA AA”。在这种情况下,在输入上一个循环的最后一个浮点数后,cin.ignore()实际上会忽略\n。因此,第一个字符串输出是正确的。

解决方案:

在进入该循环之前仅调用一次cin.ignore(),而不是为每个字符串输入都调用它。

[getline(cin, secondArray[i]);在这些输入的结尾处吃掉\n,而您不需要cin.ignore()

// `for` loop to get user input
cin.ignore(); // solution
for (int i = 0; i < SIZE; i++)
{
    cout << "Enter a name: ";
    // cin.ignore(); <-- Mistake
    getline(cin, secondArray[i]);
}
© www.soinside.com 2019 - 2024. All rights reserved.