接受与结构数组相关的输入 我现在正在练习C++,我正在从C++入门教材中做这个问题,我陷入了最后一步。基本上,我要从包含汽车信息的结构中创建一个数组,我遇到的问题是记录用户的输入。

接受与结构数组相关的输入 我现在正在练习C++,我正在从C++入门教材中做这个问题,我陷入了最后一步。基本上,我要从包含汽车信息的结构中创建一个数组,我遇到的问题是记录用户的输入。,c++,C++,我的代码: #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

我的代码:

#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;
}
#包括
#包括
结构车{
std::字符串生成;
国际年;
};
int main()
{
std::cout>lim;
car*info=新车[lim];

对于(int i=0;i来说,将cin和getline组合在一起是…时髦的。cin从不从第一个字符串中读取换行符,因此您的第一个getline调用将几乎只返回一个空白字符串。当我遇到这样的问题时,通常会在我的cin之后执行一次性getline()调用


将getline和cin组合在一起通常不是很友好。也许你应该切换到所有的getline并进行一点字符串操作?

将cin和getline组合在一起非常有趣。cin从不读取第一个字符串中的换行符,所以你的第一个getline调用几乎只会返回一个空白字符串。我通常做的是当我遇到这样的问题时,在我的cin之后执行一次性getline()调用


将getline和cin结合起来通常不是很友好。也许您应该切换到所有getlines并进行一点字符串操作?

在使用

std::cin >> lim;

一个换行符留在流中,由
getline
作为有效输入提取

您需要添加代码来忽略行的其余部分

std::cin >> lim;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

for(int i=0;istd::cout在您使用

std::cin >> lim;

一个换行符留在流中,由
getline
作为有效输入提取

您需要添加代码来忽略行的其余部分

std::cin >> lim;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

for(int i=0;i#包括
#包括
结构车{
std::字符串生成;
整年=0;
};
int main()
{
int i=0;//增量值
std::cout>lim;
car*info=新车[lim];
对于(i;iinfo[i].make;//更改为cin,就像当年一样
std::cout>info[i].year;//这很好
}
std::cout
#包括
#包括
结构车{
std::字符串生成;
整年=0;
};
int main()
{
int i=0;//增量值
std::cout>lim;
car*info=新车[lim];
对于(i;iinfo[i].make;//更改为cin,就像当年一样
std::cout>info[i].year;//这很好
}


std::您的问题是否没有明确说明。问题是什么?您有什么问题?我高度怀疑您的问题是:
while(int I=0
无论您认为它做什么,它都不会做什么。我认为,但不确定,它每次通过循环时都会使
I==1
,并导致无限循环。您已经编写了一个循环,迭代所有数组元素-为什么您觉得有必要发明一种新语法?您记录用户输入的问题还是必须这样做有输出吗?因为正如Igor所指出的,你的while循环不会输出你所期望的。@Harrison无限循环很可能是导致程序“崩溃”的原因(我猜OP正在经历的是程序停止工作)输入问题是重复的。伙计们,感谢您的输入,我成功地修复了基础问题,在最初调用cin读取输入行中仍然保留的\n后,我添加了一个cin.get(),然后添加了另一个cin.get()在获得这一年之后。你的问题没有明确说明。问题是什么?你有什么问题?我高度怀疑你的问题是:
while(int I=0
无论您认为它做什么,它都不会做什么。我认为,但不确定,它每次通过循环时都会使
I==1
,并导致无限循环。您已经编写了一个循环,迭代所有数组元素-为什么您觉得有必要发明一种新语法?您记录用户输入的问题还是必须这样做有输出吗?因为正如Igor所指出的,你的while循环不会输出你所期望的。@Harrison无限循环很可能是导致程序“崩溃”的原因(我猜OP正在经历的是程序停止工作)输入问题是重复的。伙计们,感谢您的输入,我成功地修复了基础问题,在最初调用cin读取输入行中仍然保留的\n后,我添加了一个cin.get(),然后添加了另一个cin.get()在得到一年之后,我应该得到我的LIM和信息。年。所以我应该得到我的LIM和信息。年我设法修复我的while循环,但你的第一部分的修复似乎有点先进,我还没有进入C++还没有。有可能是一个更可理解的NOOB方法?@ TaksHg,<代码> ISRAM::忽略< /代码>可以用来忽略D。输入流上的ata最多为给定的字符数。您可以用一个简单的数字替换
std::numeric\u limits::max()
,例如
100
,它也应该可以工作。好的,谢谢,我刚才还通过添加一个cin.get()修复了它要获得新行LOL.TakHHEN,记住如果在数字之后恰好进入空格键,你会遇到同样的问题。<代码> STD::忽略是一个更强壮的方法来填充剩下的行。我设法修复了while循环,但是你的第一部分的修复看起来有点先进,我还没有深入到C++中。erhaps有一种更容易理解的noob方法?@TakShing,
istream::ignore
可用于忽略输入流中的数据,最多可忽略给定的字符数。您可以替换
std::numeric\u limits::max()
使用一个简单的数字,比如
100
,它也应该可以工作。好的,谢谢,我刚才还通过添加一个cin.get()来获得新行lol来修复它。@TakS
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"
}
#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;
}