[英]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
x
, cin >> 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.