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



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

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

代码是:

主.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." 并停止,因为它到达了换行符 '|'。重要的部分是它在换行符之后停止。因此,下一次它读的第一个字符是"马格努斯·埃尔登"中的"M"。

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

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

分步分解:您输入问候语"Hello.",缓冲区将如下所示:缓冲:您好。|假设读数的开始由 ^ 表示。这些是步骤。

第 1 步。

输入:您好。

缓冲:您好。|

     ^

函数调用:getLine()

返回值:"你好。

缓冲区:

第 2 步。

输入:马格努斯·埃尔登

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

     ^

函数调用: getLine()

返回值:"马格努斯·埃尔登"

缓冲区:

第 3 步。

输入:24

缓冲:24|

     ^

函数调用:cin

返回值:24

缓冲:|

第 4 步。

输入:网球。

缓冲:|网球。|

     ^

函数调用:getLine()//请记住,它一直运行到第一个换行符 '|'。

返回值:"

缓冲:网球|

只需将代码位更改为:

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

我希望这有所帮助。

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

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

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

但它不会读取和丢弃数字后的任何空格。在每次调用cin>>x开始时(即在读取号码本身之前)丢弃空格,但不会在读取号码之后丢弃。

如果您有一个cin>>x后跟一个getline,则会出现此问题。假设您键入一个数字,然后按回车键。 cin>>x将消耗该数字。但cin>>x不会使用换行符。然后,获取行将尝试读取该行的其余部分。它不会尝试阅读下一行。我们仍然停留在与数字相同的线上。您可能在输入数字后立即按 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());

最新更新