Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我很难理解字符类型_C_Char - Fatal编程技术网

C 我很难理解字符类型

C 我很难理解字符类型,c,char,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); p

我认为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;
}
第二个printf语句是错误的,因为数组b不是字符串,因为它们缺少nul终止符

像这样试试

char b[] = {'x' , 'x' , 'x' , 'x' , 'x' , 'x' , 'x', '\0'};
因为a等于字符a[]={'a','b','c','d','e','f','g','\0'};。
当C编译器找到以下代码时,printf将打印“\0”之前的字符。

char a[] = "abcdefgh";
它实际上留出了足够的内存来存储9个字符,8个包含在字符串中的字符加上一个额外的字符来保存0,nul字符。C使用nul字符来标记字符串的结尾。如果没有它,任何C字符串函数都无法判断字符串的结尾在内存中的位置

代码

char b[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
显式地告诉C为8个字符保留存储空间,并将它们设置为您给定的值。没有指定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' };

“b”的printff将失败,因为“b”数组末尾没有字符串终止符“\0”


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

您应该包括程序的输出