2017-04-13 51 views
0

我剛剛瞭解了cstring庫中的cstring和一些函數。當我嘗試使用函數strcpy時,我遇到了一個令人困惑的問題。任何人都可以徹底向我解釋爲什麼第一個代碼不工作,而第二個代碼完全正常工作?strcpy和strcat的問題

首先代碼:

char *str1 = "hello"; 
    char *str2 = "hi"; 
    strcpy(str1, str2); 
    cout << str1; 

二碼

char str1[] = "hello"; 
    char *str2 = "hi"; 
    strcpy(s1,s2); 
    cout << str1; 

我想這個問題是我如何聲明變量STR1,但我仍然不知道爲什麼當str1和一個它不工作指針。

+1

C++ 11不允許,因爲你正在將一個字符串字面值存儲在非const char *'中。如果你打開這些,你的編譯器可能會發出警告/錯誤。 – chris

+1

使用'std :: string',所以你不必擔心它。還有'char * str1 =「hello」;'應該是編譯器錯誤/警告。如果你沒有得到一個你需要調整設置。 – NathanOliver

+0

[strncpy和strcat不工作的方式,我認爲他們會C++](http://stackoverflow.com/questions/29283567/strncpy-and-strcat-not-working-the-way-i-think-they-would- c) –

回答

0

首先,聲明char *str1 = "hello"應該給你一個警告,因爲你要分配一個指向字符串文字"hello"(這是const)以非const指針char* str1。但是如果你寫了const char *str1 = "hello",那麼警告消失,但你會得到一個錯誤strcpy,因爲第一個操作數不能是const

第二種說法是有效的,因爲在char str1[] = "hello"中,變量str1實際上是一個數組(不是指針),它的初始值是"hello"的副本。因此,您可以稍後覆蓋str1的內容。請注意0​​不是一個指針,而是一個數組;它在指針預期的上下文中使用時,會衰減到指針(指向數組第一個字符的內存)。

+0

請給出降低投票的理由,以便可以改進/糾正答案。 –