请教大家一个strlen函数的问题

来源:百度知道 编辑:UC知道 时间:2024/05/09 12:14:06
有以下程序
#include
main()
{ char p[]={'a', 'b', 'c'}, q[10]={'a', 'b', 'c'};
printf("%d %d\n", strlen(p), strlen(q));
}
以下叙述中正确的是( )。
A)在给p和q数组置初值时,系统会自动添加字符串结束符,故输出的长度都为3
B)由于p数组中没有字符串结束符,长度不能确定;但q数组中字符串长度为3
C)由于q数组中没有字符串结束符,长度不能确定;但p数组中字符串长度为3
D)由于p和q数组中都没有字符串结束符,故长度都不能确定
======================================================

书上的答案是选A

但我觉的A也不对,因为这里给数组赋值是单个字符进行赋值的,不存在字符串常量赋值,所以不可能有字符串结束标记,大家怎么看?

出这道题目的人水平太差了,多办是半路出家的,非常不专业,你的分析是有道理的。

可能出题人只用过TURBO C,因为只有TURBO C这样的小程序才喜欢画蛇添足,自动添加结束符,所以长度会都是3。

TURBO C自动添加结束符的做法是不规范的,C语言定义并没有这样规定编译器的行为,我们写程序切记千万别依赖这些不规范行为,否则在你写手机程序、UNIX程序的时候,会感到无数的莫名其妙,许多时候永远都想不明白程序原因。

你的分析完全正确,在UNIX、LINUX、FREE BSD等正规的C语言里面,都是不添加结束符的,下面是我在SCO UNIX下运行程序的情况:

$ cat a.c
main()
{ char p[]={'a', 'b', 'c'}, q[10]={'a', 'b', 'c'};
printf("%d %d\n", strlen(p), strlen(q));
}

$ cc a.c
$ a.out
9 3

为什么输出结果是9和3呢,因为UNIX装载要初始化内存为0,所以第二个长度是3,而且前面个的9可以让我们知道p和q两个变量之间有多少内存浪费来对齐:)

在C语言里面
char p[];与char *p;在功能上是等价的
唯一不同的是p[]值不可改变 *p则可以
C语言判断一个字符串结束的唯一标志是\0 -- 结束符号
{'a','b','c'}在内存里面显示的是abc\0