我很难理解char类型

时间:2015-05-05 03:14:26

标签: c char

我认为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;
}

4 个答案:

答案 0 :(得分:10)

当C编译器找到以下代码

char a[] = "abcdefgh";

它实际上留出了足够的内存来存储 9 字符,你在字符串中包含的8加上一个额外的字符来保存0,即nul字符。 C使用nul字符标记字符串的结尾。没有它,没有一个C字符串函数能够分辨出字符串结尾在内存中的位置。

代码

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

明确告诉C为 8 字符保留存储空间并将其设置为您已给出的值。没有指定nul终结符(即结尾没有0),所以C函数赢了; t能够判断这个字符串有多长。

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' };

答案 1 :(得分:1)

第二个printf()语句错误,因为数组b不是字符串,因为它们缺少nul终结符。

试试这个

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

'b'的printff将失败,因为'b'数组末尾没有字符串终结符'\ 0'。

字符串不匹配,因为'b'包含的字节少于'a',因为'a包含使其成为字符串所需的尾部'\ 0',而'b'只是一个字节数组。