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

时间:2015-01-31 19:20:45

标签: c++ ubuntu-12.04

我认为我的程序会跳过步骤,因为我在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;
}

3 个答案:

答案 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中的intcin >> 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());