繁体   English   中英

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

[英]why does my program skip steps using getline()?

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

我尝试在每个getline()之后使用cin.clear()和cin.ignore(10000,'\\ n')编写代码(真的我不知道这些功能如何正常工作,我发现它们在Google上冲浪)并且该代码无法正常工作。

代码是:

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;
}
   cout<<"insert number of Lego bricks"<<endl;
   cin>>nB;

这就是问题。 getLine()一直读取直到下一个换行符。 让我们说“ |” 是我们的换行符。

当您在终端中写入内容或从文件中读取内容时,您需要处理很多行。

输入示例(问候,姓名,年龄和爱好):

你好。|

马格努斯·埃尔登|

24 |

网球|

GetLine()将为您提供整行。 首次调用getLine()将返回字符串“ Hello”。 并停止,因为它到达了换行符'|'。 重要的是它在换行符之后停止。 因此,下一次读取的第一个字符是“ Magnus Elden”中的“ M”。

当您到达输入的年龄部分时,您可以使用cin,它仅读取第一项,无论是字符串还是数字。 这样,它将在换行符之前停止。 下次调用getLine()时,它将读取直到换行符出现为止,但是由于换行符仍保留在缓冲区中,因此getLine()立即以“”作为返回值返回。

这就是为什么它似乎跳过了一步。

分步细分:您输入问候语“ Hello”。 然后缓冲区将如下所示:Buffer:Hello。 让我们说,读取的开始由^表示。 这些是步骤。

第1步。

输入:你好。

缓冲区:你好|。

     ^

函数调用:getLine()

返回值:“你好。”

缓冲:

第2步。

输入:马格努斯·埃尔登(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());

我希望这有帮助。

getline(cin,s)将完成您的期望。 该行的其余部分(换行符本身除外)存储在s 而且,至关重要的是,换行符本身将被提取并丢弃。

因此,如果您多次调用getline(cin,s) ,则每行将按您的预期读取一次。

同样,假设int xcin >> x将读取一个整数。 连续多次调用cin >> x会将输入中的数字读入x 每次您致电cin>>x ,它将跳过数字的任何空格,然后读取数字。 因此,如果您有一组数字,可能在同一行上用空格隔开,或者在不同行上用换行符隔开,那么cin>>x会为您读取它们。

但是它不会在数字后读取和丢弃任何空格。 每次调用cin>>x (即读取数字本身之前 )都将舍弃空格,但读取数字之后不会

如果您有cin>>x后跟getline则会出现问题。 假设您键入一个数字,然后按Enter。 cin>>x将消耗该数字。 cin>>x 不会占用换行符。 然后,getline将尝试读取该行的其余部分 它不会尝试读取下一行。 我们仍然与数字停留在同一行。 您可能在输入数字后立即按Enter键,因此“该行的其余部分”只是一个空字符串。

在“键入数字”和“键入数字然后按Enter键”之间有区别

谢谢大家。 我解决了用getline代替cin >>的建议。

正是:

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

cout<<"insert number of Lego bricks"<<endl;
getLine(cin, s);
nB = atoi(s.c_str());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM