C 我很难理解字符类型
我认为a完全等于b。但是跑步的结果证明我错了。哪一部分我理解错了 代码如下: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
#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”只是一个字节数组。您应该包括程序的输出