2014-10-20 55 views
-1

嗨,大家好,我在從getline獲取輸入時遇到了一個未知的錯誤。我的目的是從用戶處取一個數字和兩個字符串作爲輸入並打印第一個字符串。這裏是問題代碼在C++的getline輸入錯誤

#include <iostream> 
using namespace std; 

int main() { 
    int t; 
    cin>>t; 
    while(t--) 
    { string s,p; 
     getline(cin,s); 
     getline(cin,p); 
     cout<<s; 
    } 
    return 0; 
    } 

現在,當我提出類似的輸入:

1 
abababa abb 
b 

它不打印anything.Why是怎麼回事?

+0

? – iokanuon 2014-10-20 13:07:04

+0

因爲他想循環運行t次。他爲什麼不應該? – 2014-10-20 13:08:00

+0

@AdrianMay'我的目的是把一個數字和兩個字符串作爲用戶的輸入並打印出第一個字符串。「 – iokanuon 2014-10-20 13:08:42

回答

4

cin>>t之後,在流中還有一個換行符,那麼換行符將被分配到s,所以cout<<s似乎什麼都不打印(實際上它打印換行符)。
cin.ignore(100, '\n');之前getline ingore換行。

+0

好thnx一噸:) – gsdf 2014-10-20 13:11:50

+0

@SurayansTiwari看到我的編輯。 – jfly 2014-10-20 13:12:53

+0

什麼是100這裏? – gsdf 2014-10-20 13:15:10

0

我認爲這是因爲getline()不會忽略新行ccharacter,但會在下一次調用yo getline時讀取它。嘗試喲把一個函數getline()每個卡萊之前,這樣的事情:

Int main() { 
int t; 
cin>>t; 

string s,p; 

getline(cin,s); 

while(t--) 
{ 
    getline(cin,s); 
    getline(cin, p); 
    getline(cin,p); 
    cout<<s; 
} 

希望它能幫助:)

0

cin >> t;壓制之後的換行符進入仍然在給std :: cin時getline(cin,s)被調用時,導致s被清空。你輸入的字符串實際上被存儲在p中。嘗試使用其他捕獲方法或刷新cin緩衝區,然後再次使用它。

0

每次你使用cin得到類似於cin >> t的東西時,它都會在輸入緩衝區中留下換行符。所以在接下來的操作中會受到影響,並且似乎跳過了「等待返回鍵」,從而導致異常。爲了避免使用cin::ignore

documentation說:從輸入序列

提取字符和丟棄它們,直到要麼 n個字符已被提取,或一個比較等於 DELIM。

如果文件結尾達到 ,函數也會停止提取字符。如果過早到達(在提取n 字符或查找分隔符之前),該函數將設置eofbit標誌。

我已經寫你的代碼很容易理解的方式,但爲什麼用姚紀中的`while`在這裏工作 讓我知道如果您有任何問題

#include <iostream> 
using namespace std; 

int main() { 
    int t=0; 
cout<<"Enter t\n"; 
    cin>>t; 
    cin.ignore(); 
    while(t>0) 
    { string s,p; 
     cout<<"Enter s\n"; 
     getline(cin,s); 
     cout<<"Enter p\n"; 
     getline(cin,p); 
     cout<<" Values s:"<<s<<" p:"<<p<<"\n"; 
     t--; 
    } 
    return 0; 
    } 
+0

哈哈! SO的人非常快。你必須愛所以! – 2014-10-20 13:25:22