2014-10-03 93 views
0

本網站上有幾個問題涉及getline無法正常工作,顯而易見的解決方案是緩衝區中還有需要清除的換行符,據推測與cin.ignore()。我已經嘗試過這麼多的變化,沒有什麼似乎工作,所有我想要做的只是簡單的控制檯輸入和cin >> string不是一個選項,因爲字符串可能有空格。getline(cin,string)不工作即使有cin.ignore()

這是我的代碼。

void prompt(std::string * str) 
{ 
    cout << "> "; 

    cin.sync(); 
    cin.get(); 
    cin.ignore(256, '\r'); 
    cin.ignore(256, '\n'); 
    cin.ignore(); 
    cin.ignore(); 

    std::string tmp; 
    getline(cin, tmp); 

    cin.sync(); 
    cin.get(); 
    cin.ignore(256, '\r'); 
    cin.ignore(256, '\n'); 

    *str = tmp; 
} 

正如你所看到的我已經嘗試了各種各樣的東西。它仍跳過getline(cin,tmp),似乎將str設置爲空字符串。請幫忙。感謝您的時間。

+2

請不要標記C++與C標籤問題 – 2014-10-03 19:49:48

+0

嘗試刪除所有'忽略()'命令,並使用'的std ::函數getline(給std :: cin> > std :: ws,tmp);'而是。 '>> std :: ws'跳過所有空格(包括行尾)。 – Galik 2014-10-03 19:50:30

+0

我沒有看到任何錯誤檢查。做'if(!cin){cout <<「某事設置了失敗位。」 << endl; }' – 2014-10-03 20:34:24

回答

0

不鼓勵使用指針傳遞變量。如果你想從函數&推薦值。

我不知道你在調用prompt()的上下文,但這裏有一個建議,可以實施prompt(),這可能對你更好。

#include <algorithm> 
#include <iostream> 
#include <string> 

// return bool so you know if it failed or not 
bool prompt(std::string& s) // use reference 
{ 
    std::cout << "> "; 
    return std::getline(std::cin >> std::ws, s); 
} 

int main() 
{ 
    char c; 
    std::string s; 

    do 
    { 
     if(!prompt(s)) // always check the imput 
      break; 

     // process the string (reverse it for example...) 
     std::reverse(s.begin(), s.end()); 
     std::cout << "reversed: " << s << '\n'; 

     std::cout << "Another go? [y/n]: "; 
    } 
    while(std::cin.get(c) && std::tolower(c) == 'y'); 
} 
1

一旦任何格式化的提取失敗,失敗位將在您的流上設置,並且未來的操作將不會執行任何操作。這樣做比較方便,因爲您可以處理組中的錯誤,而不必在每次操作之後進行檢查。但是,一旦您檢測到錯誤,您需要重置失敗位以嘗試不同的事情。做到這一點的命令很簡單:

cin.reset(); 
+0

看起來''getline'調用正在設置失敗位 – Jake 2014-10-06 02:37:19

+1

@Jake:所以在'getline'之前,'if(cin)cout <<「一切正常」<< endl;'並且在getline之後,if (!cin)cout <<「cin失敗」<< endl;'都打印?你是否重定向來自文件的輸入? 'getline'對輸入格式不是很挑剔,我不能認爲除了流結束之外,什麼會導致它失敗。 – 2014-10-06 02:41:05

+0

是的,那些都打印,我不知道你的意思,但我沒有做任何事情(故意)與文件,只是試圖讀取控制檯輸入:\ – Jake 2014-10-06 03:01:48