2016-12-31 84 views
-3

我完全對C++中的字符串輸入感到困惑。C++:通過字符獲取字符串輸入*

char str[4]; 
cin>>str; 
cout<<str; 

工程。但

char* str; 
cin>>str; 
cout<<str; 

不起作用。 爲什麼?

+0

你的意思是說'str = new char [4];'問題就解決了。 – Delsa

+0

是的,但你會有更多的問題,看到我的答案。 –

回答

0

正如Jean-FrançoisFabre所說,您可以使用std::string來實現您的目標。

萬一你想用純C的語法和字符數組(具有固定大小N - 你的情況3),你可能與類似的東西去:

#define N 3 
char str[N + 1]; 
fgets(str, sizeof(str), stdin); 

這可以確保你贏了沒有遇到溢出。

6

因爲在第二種情況下,沒有內存分配:你寫未定義的內存區=> UB(可能是:SEGV)

你可以做str=new char[4];,但如果你輸入3個以上的字符,你有緩衝區溢出問題,並且由於您無法控制用戶輸入的內容,因此無法確保不會發生。

(也可能發生在過程中的第一個工作的情況下)

所以,既然你用C++,我建議使用std::string這樣的:

std::string str; 
cin>>str; 
cout<<str; 

沒有更多char *或數組,沒有更多的分配,內存泄漏......:真正的C++。當您想要與C函數接口時,仍然可以使用str.c_str()獲取對象的const char *表示。

您也可以連接string對象是這樣的:a + b,而不是可怕的strcat,這樣的例子不勝枚舉和...

我可以涉足了幾個小時就string如何比char更好,或我可以鏈接到其他答案喜歡那些:

+0

你的意思是'str = new char [4];'會解決我的問題嗎? – Delsa

+1

將解決您的_immediate_問題。但請不要使用字符數組,你有C++的功能,使用它。 –

+0

也許OP需要幾句話說明爲什麼std :: string更易於使用...... –