2015-05-05 79 views
0

我認爲a完全等於b。但跑步的結果證明我錯了。我錯誤地理解哪一部分?我很難理解類型字符

下面的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 

    char a[] = "abcdefg"; 
    char b[] = {'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g'}; 
    printf("%s\n" , a); 
    printf("%s\n" , b); 
    system("pause"); 
    return 0; 
} 
+1

您應該包含程序的輸出 – Zags

回答

1

第二printf()說法是錯誤的,因爲數組b不是字符串,因爲他們有失蹤nul終止。

嘗試這樣

char b[] = {'x' , 'x' , 'x' , 'x' , 'x' , 'x' , 'x', '\0'}; 
1

因爲a等於char a[] = {'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g', '\0'};printf()將在'\0'之前打印字符。

10

當C編譯器發現下面的代碼

char a[] = "abcdefgh"; 

它實際上留出足夠的內存來存儲字符,你已經包含在你的字符串加上一個額外的炭持有0 8, nul字符。 C使用nul字符標記字符串的結尾。沒有它,沒有任何C字符串函數能夠告訴字符串末尾在內存中的位置。

代碼

char b[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'}; 

告訴C明確保留儲存字符,並將其設置爲你給出的值。沒有指定nul終止符(即末尾沒有0),所以C函數贏了;不能告訴這個字符串有多長。

printf("%s\n" , a); 

告訴C打印它從內存中的地址a開始的字符串。它不斷打印字符,直到找到編譯器爲你安靜地輸入的0終止符。

printf("%s\n" , b); 

告訴C打印它從內存中地址b開始找到的字符串。它保持打印字符,直到它找到0終止符,但由於沒有在數組中放入一個字符,它將繼續打印出您定義的數組後的內存中的任何內容,直到它遇到0.

要修復這需要明確告訴編譯器在其他字符之後放置一個0。爲此,您可以使用特殊字符\ 0如下:

char b[] = {'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g', '\0' }; 
0

的printff爲「B」,因爲沒有字符串結束「\ 0」在「B」數組的結尾將失敗。

字符串不匹配,因爲'b'包含比'a'少一個字節,因爲'a包含使其成爲字符串所需的尾部'\ 0',而'b'只是一個字節數組。