簡體   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