我认为我的程序会跳过步骤,因为我在While和For循环中使用getline()而不使用cin.clear()和cin.ignore()。如果我是对的,我将在哪里插入它们?
我尝试在每个getline()之后用cin.clear()和cin.ignore(10000,'\ n')编写代码(实际上我不知道这些函数是如何正常工作的,我发现它们正在冲浪谷歌)和代码无法正常工作。
代码是:
的main.cpp
#include <iostream>
#include <list>
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <utility>
using namespace std;
int main(){
string S;
cout<<"insert test....input exaple: test 1"<<endl;
getline(cin, S);
while(S!="-1"){
cout<<"START WHILE"<<endl;
int nB = 0; //number of Lego Bricks;
cout<<"insert number of Lego bricks"<<endl;
cin>>nB;
for(int i=0; i<nB; i++){
cout<<"START FOR"<<endl;
cout<<"insert Lego brick (the number of faces must be even)....input example: NameBrick -> face1 face2 face3 face4...."<<endl;
getline(cin, S);
}
getline(cin, S);
}
return 0;
}
答案 0 :(得分:0)
cout<<"insert number of Lego bricks"<<endl;
cin>>nB;
这就是问题所在。 getLine()继续读取直到下一个换行符。让我们说'|'是我们的换行符号。
当您在终端中写东西或从文件中读取内容时,您需要处理许多行。
示例输入(问候,姓名,年龄和爱好):
您好|
Magnus Elden |
24 |
网球|
GetLine()将为您提供整行。第一次调用getLine()将返回字符串“Hello”。并且因为它到达换行符'|'而停止。 重要的是它在换行符之后停止。 因此,下次读取的第一个字符是“Magnus Elden”中的“M”。
当你到达输入的年龄部分时,你使用只读取第一项的cin,无论是字符串还是数字。因此它将在换行符之前停止。下次调用getLine()时,它会读取直到换行符,但由于换行符仍然保留在缓冲区中,因此getLine()会立即返回,并返回“”作为返回值。
这就是为什么它似乎跳过了一步。
逐步细分: 你输入问候语“你好”。然后缓冲区将如下所示: 缓冲区:你好|。 让我们说读数的开始用^表示。这些是步骤。
第1步。
输入:喂
缓冲液:你好|
^
函数调用:getLine()
返回值:“你好。”
缓冲液:
第2步。
输入:Magnus Elden
缓冲区:Magnus Elden。|
^
函数调用:getLine()
返回值:“Magnus Elden”
缓冲液:
第3步。
输入:24
缓冲液:24 |
^
函数调用:cin
返回值:24
缓冲液:|
第4步。
输入:网球
缓冲液:|。网球|
^
函数调用:getLine()//记住它一直运行到第一个换行符“|”。
返回值:“”
缓冲液:网球|
只需将代码位更改为:
cout<<"insert number of Lego bricks"<<endl;
getLine(cin, s);
nB = atoi(s.c_str());
我希望这会有所帮助。
答案 1 :(得分:0)
getline(cin,s)
会做你期望的。该行的其余部分(换行符本身除外)存储在s
中。而且,至关重要的是,换行本身将被提取并丢弃。
因此,如果您多次致电getline(cin,s)
,则每行都会按预期读取一次。
同样,假设x
中的int
,cin >> x
将读取整数。多次连续拨打cin >> x
会将输入中的数字读入x
。每次拨打cin>>x
时,它都会跳过之前的任何空格,然后读取该号码。因此,如果您有一组数字,可能在由空格分隔的同一行上,或者可能在由换行符分隔的不同行上,那么cin>>x
将为您读取它们。
但它不会在数字后读取和丢弃任何空格。在每次调用cin>>x
时开始丢弃空格(即在之前读取数字本身),但 之后号码已被阅读。
如果cin>>x
后跟getline
,则会出现此问题。想象一下,您键入一个数字,然后按Enter键。 cin>>x
将使用该数字。但cin>>x
将不使用换行符。然后,getline将尝试读取该行的 rest 。它不会尝试读取 next 行。我们仍然与数字保持同一条线。您可能在输入数字后立即按Enter键,因此&#34;其余部分&#34;只是一个空字符串。
&#34;键入数字&#34;之间存在差异。和&#34;键入一个数字,然后按Enter键&#34;
答案 2 :(得分:0)
感谢所有人。 我解决了替换cin&gt;&gt;你有多少人建议使用getline。
精确地:
cout<<"insert number of Lego bricks"<<endl;
cin>>nB;
与
cout<<"insert number of Lego bricks"<<endl;
getLine(cin, s);
nB = atoi(s.c_str());