因此,根据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”似乎被空字符覆盖。另外,为了将来更好地解决问题,我是否应该有更好的方式提出问题?
问题:
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]);
}