我是编程新手。现在我正在学习C
和Java
。
我有一个这样的数组 -
char *array = {"zero", "one", "two", "three"};
从这个link
我可以像这样打印数组内容 -
printf("%s %s", array[0], array[1]); //zero one
但我的问题是如何打印array[0]
,array[1]
引用的长度等等。我知道我可以做这样的事情 -
printf("%d\n", sizeof("zero");
但是我可以使用array
变量本身打印大小。
我尝试过不同的方式,比如 -
printf("%d\n", sizeof(array[0]); //4
printf("%d\n", sizeof(*array[0]); //1
但每次我得错了答案。
由于
答案 0 :(得分:4)
数组中每个元素的大小相同,因为数组被声明为指针数组
char * array[] = {"zero", "one", "two", "three"};
^^^^^^
(注意你必须使用记录数组[])
这就是数组的每个元素都有char *
类型,相应地,在运行程序的环境中它的大小等于4。
实际上,您希望获得由数组元素指向的字符串文字的大小。为此,您可以使用标头strlen
中声明的标准C函数<string.h>
该函数将返回字符串文字中的字符数,直到终止零字符。
printf( "%zu\n", strlen( array[0] ) ); // returns 4 for "zero"
printf( "%zu\n", strlen( array[1] ) ); // returns 3 for "one"
答案 1 :(得分:1)
您需要strlen
。
printf("%d\n", (int) strlen(array[0]));
答案 2 :(得分:1)
首先,如果你想声明一个char *
ie char
指针的数组,对于字符串文字,会遗漏两件事,[]
和{{1}因为你不想意外地修改它,所以
const
将是正确的方式。
原因是const char *array[] = {"zero", "one", "two", "three"};
终止符,在
nul
正确的值为printf("%zu\n", sizeof(array[0]))
而非5
,因为4
使用"zero"
字节5
而不是"zero\0"
,最后一个是标记ac字符串结尾的4
终止符。
如果你的字符串非常简单和规则,那么nul
将给出正确的值,虽然它不是一个健壮的解决方案,因为它假设字符串是一个简单的字符串,如{{1}如果字符串嵌入sizeof(array[0]) - 1
字节,它将失败,例如"zero"
,这是一个有效的字符串文字,'\0'
将给"zero\0one\0"
。
在c中获取字符串长度的正确方法是迭代字节,直到sizeof
出现,这是strlen()
的作用,因此您可以使用10
非常小心,因为如果你不小心,它也可能很容易失败,而且
'\0'
将返回strlen()
,因为printf("%zu\n", strlen("zero\0one\0"));
的第一次出现将足以让函数返回。
由于同样的原因,4
也会输出'\0'
。
printf("%s\n", "zero\0one\0");
最危险的事情是传递一个非zero
终止的序列,这将导致未定义的行为,字符串文字完全没有危险,但是如果定义一个数组并且手动填写字符,很容易忘记添加终止strlen()
,而且使用nul
并不难。