C++ 为什么我的程序使用getline()跳过步骤?

C++ 为什么我的程序使用getline()跳过步骤?,c++,ubuntu-12.04,C++,Ubuntu 12.04,我认为我的程序跳过了步骤,因为我在While和For循环中使用了getline,而没有使用cin.clear和cin.ignore。如果我是对的,我将在哪里插入它们 我试图用cin.clear和cin.ignore10000编写代码,“\n”在每次getline之后,我真的不知道这些函数如何正常工作,我发现它们在Google上冲浪,代码无法正常工作 代码是: main.cpp 函数调用:getLine 返回值:Hello 缓冲区: 第二步 输入:Magnus Elden 缓冲区:马格努斯·埃尔登

我认为我的程序跳过了步骤,因为我在While和For循环中使用了getline,而没有使用cin.clear和cin.ignore。如果我是对的,我将在哪里插入它们

我试图用cin.clear和cin.ignore10000编写代码,“\n”在每次getline之后,我真的不知道这些函数如何正常工作,我发现它们在Google上冲浪,代码无法正常工作

代码是:

main.cpp

函数调用:getLine

返回值:Hello

缓冲区:

第二步

输入:Magnus Elden

缓冲区:马格努斯·埃尔登|

     ^
函数调用:getLine

返回值:Magnus Elden

缓冲区:

第三步

输入:24

缓冲区:24|

     ^
函数调用:cin

返回值:24

缓冲区:|

第四步

输入:网球

缓冲区:网球|

     ^
函数调用:getLine//记住它一直运行到第一个换行符“|”

返回值:

缓冲区:网球|

只需将代码位更改为:

cout<<"insert number of Lego bricks"<<endl;
getLine(cin, s);
nB = atoi(s.c_str());
我希望这能有所帮助。

getlinecin,s会做你所期望的。除换行符本身之外的行的其余部分存储在s中。而且,至关重要的是,新行本身将被提取并丢弃

因此,如果您多次调用getlinecin,s,那么正如您所期望的那样,每一行都将被读取一次

类似地,假设x为int,那么cin>>x将读取一个整数。对cin>>x的多个连续调用将从输入读取数字到x。每次调用cin>>x时,它都会跳过号码前的任何空格,然后读取号码。因此,如果您有一组数字,可能在同一行上用空格分隔,或者在不同行上用换行符分隔,那么cin>>x将为您读取它们

但它不会读取并丢弃数字后的任何空格。在每次调用cin>>x时,即在读取号码之前,而不是在读取号码之后,都会丢弃空格

如果有一个cin>>x后跟一个getline,则会出现问题。假设您键入一个数字,然后按enter键。cin>>x将使用该号码。但是cin>>x不会使用换行符。然后,getline将尝试读取该行的其余部分。它不会尝试读取下一行。我们仍然和电话号码在同一条线上。您可能在输入数字后立即按Enter键,因此该行的其余部分只是一个空字符串

键入一个数字和键入一个数字然后按回车键之间有区别,多亏了all。 我解决了用getline替换cin>>的问题,你们中有多少人提出了这样的建议

确切地说:

cout<<"insert number of Lego bricks"<<endl;
cin>>nB;


我甚至还没有回答这个问题,但当我看到标题时,我知道你在混合调用cin>>和getline。不要使用>>操作符!这是邪恶的。根据上下文、运算符的特定重载和流对象的历史/状态,它可能会也可能不会在空格、换行符或其他字符类处使用和/或停止。建议“清晰”和“忽略”的解决方案不是真正的解决方案——它们有时能够消除一些症状,但不能减轻错误的原因。您所说的跳过步骤是什么意思?您的程序试图做什么?因此,简而言之,解决方案应该是始终使用getline。如果您需要输入字符串以外的类型,您可以执行字符串到任何类型的转换,例如。G对于数值,有std::stoi和std::stod等。*没有,愚蠢的我,我太累了。你能用更简单的语言向我们解释一下这个程序应该做什么吗?当前代码似乎是这样的:1输入一行文本,然后2读取一个整数nB,然后3读取nB行,然后4读取另一个最后一行。这是怎么回事?请把这个简单明了的描述放在问题中
     ^
cout<<"insert number of Lego bricks"<<endl;
getLine(cin, s);
nB = atoi(s.c_str());
cout<<"insert number of Lego bricks"<<endl;
cin>>nB;
cout<<"insert number of Lego bricks"<<endl;
getLine(cin, s);
nB = atoi(s.c_str());