2013-02-23 45 views
0

我正在學習C++,並且仍然保持運行到愚蠢的問題,因爲我與C++庫,以及常見的錯誤又不熟,等函數getline(isstream,字符串)在C++

現在,以下一塊我的代碼失敗:

#include <iostream> 
#include <string> 
#include <cstdlib> 
#include <sstream> 

void getInt(int & val){ 
    string output; 
    getline(cin output.c_str()); 
    val = atoi(output.c_str()); 
} 

,並給了我這個錯誤,當我嘗試編譯:

test.cpp: In function void getInt(int&): 
test.cpp:51: error: expected) before output 
test.cpp:51: error: no matching function for call to getline(std::istream&) 

我在做什麼錯?我覺得我失去了一些明顯的東西。

+2

'getline(cin output.c_str());'缺少逗號。 – 2013-02-23 18:46:58

+0

@Daniel Fischer哇 - 簡單修復。我討厭在終端工作與emacs大聲笑。你能發表一個答案,以便我可以接受嗎?你是第一個。 = P – Jonathan 2013-02-23 18:47:55

+1

真的嗎?這是你的問題?你沒有做任何調試? – 2013-02-23 18:49:47

回答

3

getline需要兩個參數。將多個參數傳遞給函數時,必須用逗號分隔它們。此外,第二個參數可以是std::string,所以只是通過output直接:

getline(cin, output); 
4

應該

getline(cin, output); // comma, no .c_str() 

如果你這樣做.c_str(),你要去當你嘗試調用未定義行爲將數據讀入,只讀內存區域。這是一些不好的魔咒。當然,正如Lightness在評論中指出的那樣,它甚至不會編譯,因爲c_str()const char*getline()需要char*(非const)(但即使您確實設法讓它編譯,瞭解未定義的行爲)。

+0

感謝您指出我不需要.c_str()。我原本沒有,但當我開始嘗試解決問題時,我添加了它。 – Jonathan 2013-02-23 18:49:52

+2

這不是「不需要.c_str()」 - 它是「_can't_ use .c_str()」。 – 2013-02-23 18:50:55

+0

實際上,它會導致編譯錯誤,因爲'std :: string :: c_str()'產生一個'char const *'。 – 2013-02-23 18:52:40

2
getline(cin output.c_str()); 

您忘記了一個逗號,skippy。

另外,你的第二個參數是錯誤的!該字符串本身只叫output,當您需要獲取C風格字符緩衝區以便與C API一起使用時,您應該只應用.c_str()。即不在這裏。

getline(cin, output); 
+0

爲什麼downvotes? :( – 2013-02-23 18:50:20

+0

我正要說同樣的事情。他是正確的,那是我的問題,我不認爲他有義務不尊重「滑雪」或任何東西? +1 – Jonathan 2013-02-23 18:51:03

+0

謝謝@Jonathan。不,「skippy」只是我最喜歡的OP中的一個深情的寵物名字。 – 2013-02-23 18:51:52