2012-10-04 176 views
2

需要您的幫助才能獲取用戶輸入。
我希望用戶輸入一個有空格的字符串。 我無法使用cin>>variable作爲之間的空間使問題出錯。 如果我使用getline(cin,string_variable)它工作正常。但我需要輸入兩次才能使其工作。爲什麼必須輸入getline(cin,string)兩次?

cout<<"Enter movie name"; 
getline(cin, mvName); 
getline(cin, mvName); 

有沒有更好的方式來獲取用戶輸入的比這或有任何其他代碼類型,而不是輸入,則對getline兩次?請諮詢。

+1

你敲回車從'「輸入電影名稱」'問題下移?這會在stdin中放入一個空行,第一個'getline()'會讀取,然後第二個'getline()'會讀取您輸入的文本。 – hmjd

回答

6

當使用in >> value和無格式的輸入格式輸入之間切換,例如,使用std::getline(in, value)您需要確保你已經消耗了你不感興趣的任何空白。在你的情況下,前面的輸入可能在緩衝區中有一個換行符。假設你NIT感興趣的前導空格最簡單的方法就是用這樣的:

if (std::getline(std::cin >> std::ws, mvName)) { 
    process(mvName); 
} 

BTW,您應經常檢查您輸入成功。

+0

OP:「我希望用戶輸入一個有空格的字符串」。也許OP想從空白處開始,比如「Dog Soldiers」? – PiotrNycz

+1

如果目標是保留前導空格,則可能需要以不同方式進行同步,例如,忽略直到幷包括第一個換行符的所有內容:'std :: cin.ignore(std :: numeric_limits :: max (),'\ n'));'描述太模糊,無法確定究竟需要什麼。 –

2

我不得不使用沒有任何問題:

char mvName[32];

cin.getline(mvName, 32);

而且我只有一次沒有問題再次調用它。

+0

但是,下一個提示會自動顯示,並且不允許我輸入以前的提示 – rasul1719435

+0

因爲什麼原因,我無法重新創建所述的錯誤。儘管我的理論是,在緩衝區的某個地方只有cin.ignore(256)被刷新,但是我們的理論是這樣的。 – M4rc

1

也許你只是忘了在你的提示信息添加\n

cout<<"Enter movie name:\n"; 

但是如果你想跳過空行 - 這樣做:

// skip empty lines 
while (cin >> mvName && mvName.empty()); 
// here mvName contains non empty string or it is empty because of error in reading 
.... 
+0

爲什麼他在提示信息中需要一個''\ n''? –

+0

@James查看hmjd的回答。這是原因 - 人類渴望開始從新線打字;) – PiotrNycz

+0

我對此持懷疑態度。如果請求的輸入是一個句子或者某個東西,也許,但是如果輸入類似於名字,通常不會去到下一行的開頭。 (我懷疑Dietmar是在正確的軌道上;他之前做過輸入,並且來自之前輸入的字符導致了這個問題。) –

1

由於問題沒有新行字符我懷疑你打入輸入從"Enter movie name"問題下移?這會在第一個getline()會讀取stdin一個空行,然後第二個getline()將讀取您輸入的文本。

要刪除輸入初始換行字符的要求,只是將它添加到問題的字符串文字:

std::cout<< "Enter movie name:\n"; 
0
cout<<"Enter movie name"; 
    getline(cin, mvName); 

工作正常!

也許你不得不使用getline(cin, mvName);兩次是因爲你輸入一些字符到第一getline(cin, mvName);像空格,回車等

相關問題