2016-12-30 50 views
0

我想編輯使用字符文字初始化後的字符串,如下所示:爲什麼改變一個字符串的字符不能給出想要的字符?

int main() { 
    char str1[10] = "hello"; 
    str1[0] = "b"; 
    printf("%s\n", str1); 
    return 0; 
} 

結果是「報」,即一個「d」,而不是「B」。同樣,下面只是提供廢話。

int main() { 

    char str1[10]; 

    str1[0] = "h"; 
    str1[1] = "e"; 
    str1[2] = "l"; 
    str1[3] = "l"; 
    str1[4] = "o"; 

    printf("%s\n", str1); 
} 

我發現一個StackOverflow上post是提到這一點應引起段錯誤或接入衝突錯誤,但它並沒有真正解釋爲什麼。

+3

'STR1 [0] = 「B」;'==>'STR1 [0] = 'B';' –

+1

」 ...用字符文字.. 。「 - 這些不是字符文字;他們是*字符串*文字。 – WhozCraig

+2

你必須注意編譯器警告。你的代碼在GCC中生成了幾個,甚至沒有打開額外的警告。 –

回答

12
str1[0] = "b"; 

這裏,"b"是一個字符串文字,一個字符。字符是單引號括起來:

str1[0] = 'b'; 

如果你啓用了編譯器警告你會得到這樣的:

警告:不兼容的指針從「字符[2整數轉換分配給「炭」 ]」 [-Wint轉換]

str1[0] = "b"; 
     ^~~~ 

在第二個代碼,你的S特林缺少終止null-character,因此將它傳遞給printf會調用未定義的行爲,因爲printf無法知道您的字符串在哪裏結束。要在末尾追加空字符,只是做:

str1[5] = '\0'; 
+1

你也應該像這樣初始化str1:'char str1 [10] = {0};'或者設置'str1 [5] ='\ 0';' – bruceg

+1

非常感謝! (我的編譯器說:「賦值使得指針中的整數沒有投射[-Wint-conversion]」,這對我來說毫無意義) – user1379351

3

在C,單引號字符識別和雙引號創建一個字符串。

嘗試做以下:

str1[0] = 'b'; //note the single quote 
相關問題