接受与结构数组相关的输入

时间:2014-12-20 04:57:49

标签: c++

我目前正在练习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”问题的输入并跳转到了年份..然后它崩溃成了遗忘...可能是一个分段错误

3 个答案:

答案 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并进行一些字符串操作?