我认为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;
}
答案 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'只是一个字节数组。