我写了一个程序,询问用户要编目的汽车数量。该程序使用new创建一个包含许多汽车结构的动态数组。接下来,它应该提示用户输入每个结构的品牌和年份信息。
然而,我错过了#34; WHILE"表达之前。程序直接运行到最后。结果如下:
预期结果应为
发生了什么问题?当我需要用数字数据替换读取字符串时,我该怎么办?
以下是我的源代码:
#include <iostream>
#include <string>
using std::string;
// create car structure
struct car
{
string make;
int year;
};
int main()
{
using std::cout;
using std::cin;
using std::endl;
int num;
cout << "How many cars do you wish to catalog? ";
cin >> num;
while (cin.get() != '\n')
;
// create a dynamic array
car * catalog = new car [num];
//store
for (int i = 0; i < num; ++i)
{
cout << "Car #" << i + 1 << ":\n";
cout << "Please enter the make: ";
getline(cin, catalog[i].make);
cout << "Please enter the year made: ";
cin >> catalog[i].year;
while (cin.get() != '\n')
;
}
//display
cout << "Here is your collection: \n";
for (int i = 0; i < num; ++i)
{
cout << catalog[i].year << " " << catalog[i].make << endl;
}
delete [] catalog;
return 0;
}
答案 0 :(得分:0)
当您向std::cin
输入内容时,始终会有'\n'
,因为您使用回车键结束输入。
当您调用cin >> num
时,std::cin
将仅提取数字,而不是尾随'\n'
。因此,在此之后,尾随'\n'
仍将出现在输入缓冲区中
当您在此之后致电getline
时,它会读取(并弃置)'\n'
。
我的建议:不要混用std::cin.operator >>
和getline
即使两者都将提取并丢弃前导空格,getline
始终将'\n'
视为输入的结尾,并将提取并丢弃它。
另一方面,std::cin.operator >>
不会读取'\n'
,并将其视为空格。
答案 1 :(得分:0)
While(cin.get()!='\n');
这行代码消除了输入缓冲区中的换行符。
但问题是什么?
因为这行
getline(cin, catalog [i].make);
该行有什么问题?
问题出在这里,getline()函数从输入缓冲区读取内容,直到找到'\ n'。执行上面的代码时
cin>>catalog[i].made
您将输入数字并按Enter键。但在这种情况下,'\ n'将保留在缓冲区中。如果'\ n'仍然在缓冲区中,那么getline()函数将读取'\ n'并且它将假定您输入了输入。但实际上没有数据被读取。
所以不要使用getline()代替
cin>>catalog[I].make;