鍍金池/ 問答/C/ 字符串幾種表現(xiàn)形式的輸出中有一種的輸出結(jié)果和其他的不一樣是怎么回事?

字符串幾種表現(xiàn)形式的輸出中有一種的輸出結(jié)果和其他的不一樣是怎么回事?

目前知道的字符串有以下幾種表現(xiàn)形式:

    // 字符串的幾種表現(xiàn)形式
    char str1[] = "abc";
    char str2[100] = "abc";
    char str3[] = {'a' , 'b' , 'c'};
    char str4[100] = {'a' , 'b' , 'c'};
    char str5[] = {"abc"};
    char str6[100] = {"abc"};

輸出他們的結(jié)果是:

clipboard.png

其中第五種表現(xiàn)形式對應(yīng)的字符串定義是:char str3[] = {'a' , 'b' , 'c'} 。輸出的語句是:printf("第五種表示:%s\n" , str3)

為什么會出現(xiàn)這樣的結(jié)果??

完整的運行結(jié)果(僅出錯部分)

clipboard.png

回答
編輯回答
遺莣

c的字符串數(shù)組需要在末尾有'0'標志字符串結(jié)束, 很多時候'0'會自動添加. 但是 char[] str = {'a', 'b', 'c'};不會這樣, 所以你需要char[] str = {'a', 'b', 'c', '\0};

你漏了'0', 所以scanf沒有讀到'0', 會一直讀下去, windows下會輸出燙, 至于為什么, 讀這里

https://www.zhihu.com/questio...

https://zhuanlan.zhihu.com/p/...

爆棧的相關(guān)帖子:

https://stackoverflow.com/que...

https://stackoverflow.com/que...

https://stackoverflow.com/que...


2017年3月3日 06:40
編輯回答
寫榮

linux下運行正常,無任何錯誤,看了樓上的答案,對于出現(xiàn)燙的原因有所學(xué)習(xí),不過在linux下卻未提示段錯誤,能否貼上全部代碼.你第5種打印的str3?
xcode下運行結(jié)果:
圖片描述
gcc下運行結(jié)果:
圖片描述

在xcode下打印了兩遍abc,a的ascii碼值16進制形式61 = 97
gcc下應(yīng)該默認給str4[3]='0',因此gcc下運行正常。

因此推斷,這種錯誤依據(jù)編譯器的不同處理不同,錯誤產(chǎn)生的原因是缺少顯示的‘0’賦值,因此出現(xiàn)這種依據(jù)不同編譯器而不同的行為。

2017年1月10日 18:25