2012-06-29 75 views
0

我下面提到的程序:誤差得到

string s; 
cout<<"Enter a string:"; 
gets(s); 

我希望我輸入的形式爲:「希爾頓酒店」。

使用得到,我得到以下錯誤:

error: cannot convert ‘std::string {aka std::basic_string<char>}’ to ‘char*’ for argument ‘1’ to ‘char* gets(char*)’ 

我不能用「CIN」我希望我的投入包括空間和特殊字符,如「_」等等,我也希望我的分隔符是'輸入'。有沒有其他的方式......或者請糾正錯誤。

+5

「獲取錯誤」是一個重言式。切勿使用獲取。 –

回答

4

gets不是很C++(它與C兼容)。使用此:

#include <iostream> 
#include <string> 

int main() 
{ 
    std::getline(std::cin, s); 
    std::cout << s << '\n'; 
} 

而且,看std::ios::skipws<iomanip>的空白處理選項

+0

我的鏈接更好:) – sehe

0

I can not use "cin" as I want my input to consist of space and special characters

您可以使用cin

Is there some other way...or please be kind enough in correcting the error.

gets接收char*,所以使用的char*代替string

0

第一個問題:'gets'需要一個char數組讀取。你不能給它一個stl字符串,這沒有任何意義。你需要做類似

char buf[1024]; 
gets(buf); 

第二個問題:'gets'來自舊的C stdio庫。您不應該嘗試將stdio訪問與C++風格的I/O混合 - 每個庫都會維護它自己的緩衝區,只會導致混淆。如果你使用一個輸入和另一個輸出你可能會得到它,但它是一個壞主意 - 學習使用C++風格的輸入做你想做的事(std :: getline,我認爲,例程你需要)。第三,BIG HONKING問題:'gets'是C早期那些令人討厭的繼承函數中的一個,並且不能安全地使用。不要試圖使用'gets'EVER。

問題是'gets'不知道它讀入的緩衝區大小是多少,所以它總是能夠溢出緩衝區並覆蓋內存(導致各種潛在問題)。永遠不要試圖使用gets in any。如果你想要做的stdio風格的輸入,使用

fgets(buf, bufsize, stdin) 

這需要一個緩衝區大小,不會過度運行它的輸入緩衝區。