changrui0608
首先,在语法上,三句都是正确的,但按照C语言中字符串的用法,第二句是错误的,可能导致无法预料的错误结果。在C语言中,我们一般说的字符串,其实就是字符数组(区别于C++,Java等语言),而用类似char a[]这样的方式,定义的就是一个字符数组,所以是正确的。 C语言中我们这么规定字符串:从字符数组下标0开始存储字符串,在字符串结束后,下一个位置用字符'\0'作为结束标记,也就是说,数组长度应该是字符串长度+1。下面解析一下这个程序:#include
#include
#include
int main()
{
char a[] = "abc"; // 定义一个字符数组,字符串长度为3,实际数组长度为4
// a[]没写数字的情况下编译器根据后边的"abc"推断出,字符串长度为3,数组长度为4
// 所以等效于 char a[4] = "abc"
char b[3] = "xyz"; // 手动制定数组长度为3,内容为"xyz",所以结尾没有'\0'
// 因为正好放得下"xyz",即使没有'\0',也没有错误或警告
// 但不符合C语言中字符串定义,可能导致错误!
char c[10] = "123456"; // 长度为10,只用了6+1=7个位置,稍浪费一些内存,但不会出错。
char d[3] = "ABCDEF"; // 长度真正超出范围,能编译,会有warning
printf("字符串a的长度是:%d, 内容是:%s \n", strlen(a), a);
printf("字符串b的长度是:%d, 内容是:%s \n", strlen(b), b);
printf("字符串c的长度是:%d, 内容是:%s \n", strlen(c), c);
printf("字符串d的长度是:%d, 内容是:%s \n", strlen(d), d);
return 0;
}在我的运行环境下,a和c的结果正确,b的结果是"xyzabc",d的结果是"ABC123456",都是不可预料的结果。在其他编译器、运行环境下,a和c应当还是正确的,b和d结果可能有所不同。总之,使用字符串时,需要按照C语言的规定来,才能有正确结果,否则即使能够通过编译,得到的结果也是不可预料的。所谓“自己亲手编程验证”,很可能有不完善的地方,不可作为正确与否的依据。