2014-02-28 35 views
1

我使用蘋果LLVM 3.0,顯然有一個錯誤std::getlinecin.getline,這需要用戶推入輸入兩次,以便std::getline函數返回控制回程序。取此示例代碼,例如:C++如何修復std :: cin錯誤或解決它

int main(int argc, const char * argv[]) { 
    using namespace std; 

    string str; 

    cout << "Enter some text: "; 
    getline(cin, str); 

    cout << "\nYou Entered: " << str; 

    return 0; 
} 

結果:

Enter some text: hello world 

我按回車一次,程序仍在運行,並等待輸入。我必須再次輸入以便程序停止詢問輸入並繼續執行。

我已經搜索了答案,這顯然是libC++中的一個錯誤,類似的錯誤也出現在MS VC++ 6.0中(我認爲)。

我試着通過使用cin.get(char)實現我自己的getline函數來解決問題,並在遇到'\ n'或'\ r'字符時返回。這是下面的代碼:

std::istream& getline(std::istream &in, std::string &str) { 
    char ch; 

    str.clear(); 

    while (in.get(ch) && ch != '\n' && ch != '\r') { 
     str += ch; 
    } 

    return in; 
} 

不幸的是我仍然有同樣的問題,第一個新行字符不會被in.get返回因此,該程序再次掛起等待用戶推動第二次進入。有沒有解決這個問題的方法或解決方案,而不訴諸於陳舊的C-style fgets(stdin, buffer, bufsize)

+1

加上'<<的std :: fflush'每個輸出後'cout' –

+0

在getline之前忽略(也許) –

+0

嘗試了兩者。我仍然有同樣的問題不得不推入輸入兩次。 – ALXGTV

回答

1

這是迄今爲止我發現的唯一解決方法。下面是我自己的版本函數getline的:

std::istream& getline(std::istream &in, std::string &str) { 
    char chr; 
    std::ios_base::fmtflags flags = in.flags(); 

    str.clear(); 

    while ((in >> std::noskipws >> chr) && (chr != '\n') && (chr != '\r')) { 
     str += chr; 
    } 

    in.flags(flags); 
    return in; 
} 

以上功能的實現方法std::getline預計,它返回第一個進入推後。

1

我剛剛嘗試過使用最新版本的Xcode和Apple的LLVM,並且無法重現此操作。 (即,我只有打一次)

$ clang++ --version 
Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn) 
Target: x86_64-apple-darwin13.1.0 
Thread model: posix 

我建這樣的:

$ clang++ -stdlib=libc++ so.cpp