2015-05-05 75 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'只是一个字节数组。