我目前正在练习C ++,而我正在从C ++ Primer Plus教科书中提出这个问题,而我最后一步陷入困境。基本上我是用一个包含汽车信息的结构制作一个数组,我遇到问题的问题就是记录用户的输入。
我的代码:
#include <iostream>
#include <string>
struct car{
std::string make;
int year;
};
int main()
{
std::cout << "How many cars do you wish to catalog? ";
int lim;
std::cin >> lim;
car* info = new car[lim];
for(int i = 0; i<lim; i++)
{
std::cout << "Please enter the make: ";
getline(std::cin, info[i].make); // problem here..
std::cout << "Please enter the year made: ";
std::cin >> info[i].year; // problem here as well :(
}
std::cout << "here is your collection:\n";
while(int i = 0 < lim)
{
std::cout << info[i].make << " " << info[i].year << std::endl;
//std::cout << "here is your collection:\n"
i++;
}
return 0;
}
有人可以帮助解释为什么它不起作用吗?
具体来说,我的问题是它没有正确输入我的输入,并且我的exe文件似乎跳过了“make”问题的输入并跳转到了年份..然后它崩溃成了遗忘...可能是一个分段错误
答案 0 :(得分:2)
使用
读取数字后std::cin >> lim;
和
std::cin >> info[i].year;
流上会留下换行符,getline
将其作为有效输入。
您需要添加代码以忽略其余部分。
std::cin >> lim;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
和
std::cin >> info[i].year;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
请参阅istream::ignore
上的文档。
另外,更改
while(int i = 0 < lim)
{
std::cout << info[i].make << " " << info[i].year << std::endl;
//std::cout << "here is your collection:\n"
i++;
}
到
for(int i = 0; i < lim; ++i)
{
std::cout << info[i].make << " " << info[i].year << std::endl;
//std::cout << "here is your collection:\n"
}
答案 1 :(得分:2)
#include <iostream>
#include <string>
struct car{
std::string make;
int year = 0;
};
int main()
{
int i = 0; //increment value
std::cout << "How many cars do you wish to catalog? ";
int lim;
std::cin >> lim;
car* info = new car[lim];
for(i; i < lim; i++)
{
std::cout << "Please enter the make: ";
std::cin >> info[i].make; // change to cin, just like the one for year
std::cout << "Please enter the year made: ";
std::cin >> info[i].year; // this was fine
}
std::cout << "here is your collection:\n";
i = 0; //resets the increment value
while(i < lim)
{
std::cout << info[i].make << " " << info[i].year << std::endl;
//std::cout << "here is your collection:\n"
i++;
}
return 0;
}
答案 2 :(得分:0)
结合cin和getline是......时髦。 cin从不从第一个字符串中读取换行符,所以你的第一个getline调用几乎只返回一个空字符串。当我遇到这样的问题时,我通常会做的是在我的cin之后执行一次性的getline()调用。
结合getline和cin通常不是非常友好。也许你应该切换到所有的getlines并进行一些字符串操作?