[英]strlen returning wrong value for 2d array
为什么是这样:
char animals[][30] = {{"cow "}, {"dog "}, {"frog "}, {"gecko "}, {"cat"}};
当我这样做时返回 4 而不是 5:
printf("%d\n", strlen(animals));
据我所知,字符 arrays 有 5 个不同的 arrays,所以我不确定为什么它说有 4 个。
本声明
char animals[][30] = {{"cow "}, {"dog "}, {"frog "}, {"gecko "}, {"cat"}};
不声明包含字符串的一维数组。
function strlen
的参数类型应为char *
。 但是您使用的是char ( * )[30]
类型的参数。
您需要的是以下内容
printf( "%zu\n", sizeof( animals ) / sizeof( *animals ) );
我不知道为什么它说有 4 个。
因为在printf
的这个调用中使用了无效的转换说明符%d
而不是%zu
printf("%d\n", strlen(animals));
调用中参数animals
的值
strlen(animals)
被认为是长度确实等于4
的数组的第一个元素的地址。
那是从这个调用的地址平等的角度来看
strlen(animals)
相当于调用
strlen(animals[0])
因为第一次调用中使用的animals
的值等于其第一个元素animals[0]
的地址值。 尽管在第一次调用strlen
时,参数的类型无效。
编译器应该发出一条消息,表明您在strlen
的调用中使用了不正确的参数。
strlen()
用于计算字符串的长度(C 中以空字符结尾的字符序列),而不是用于计算数组元素的数量。
要获得数组中元素的数量,可以将数组的大小除以数组元素的大小。
printf("%zu\n", sizeof(animals) / sizeof(*animals));
另请注意,您应该使用%zu
而不是%d
来打印size_t
( strlen()
和sizeof
return size_t
)
调用printf("%d\n", strlen(animals));
存在多个问题。
<string.h>
正确声明了strlen
,则printf
格式应为%zu
。 这不太可能造成问题,但应该解决。strlen()
采用 C 字符串,而animal
不是 C 字符串,它是char
的二维数组。 你应该通过strlen(animal[0])
。 同样,这个错误不太可能造成问题,因为二维数组中第一个字符串的地址与数组本身的地址相同。 要计算二维数组中的元素数量,请使用sizeof(animal) / sizeof(*animal)
。4
(字符串"cow "
有一个尾随空格)和一个换行符,返回值将是2
作为 output 的字符数printf
。试试这个修改后的版本:
#include <stdio.h>
#include <string.h>
int main() {
char animals[][30] = {{"cow "}, {"dog "}, {"frog "}, {"gecko "}, {"cat"}};
printf("number of strings: %zu\n", sizeof(animals) / sizeof(*animals));
for (size_t i = 0; i < sizeof(animals) / sizeof(*animals); i++) {
printf("%zu: \"%s\", %zu chars\n", i, animals[i], strlen(animals[i]));
}
return 0;
}
您的问题的基本答案
“当我这样做时返回 4 而不是 5”
当你这样做时
printf("%d\n", strlen(animals));
动物是指向第一个字符串的指针,动物在 memory 中存储为“cow \0........dog \0...” 其中.....是直到下一个数组条目的字节(如果未初始化,通常是随机的 memory 东西)。 当你 printf strlen 动物它返回 strlen 的“牛”。
您正在混合类型.. c 允许这样做,因为它们确实是指针,这就是编译器可以工作但错误的原因。
要获得 5 作为结果,您需要执行此操作
printf("%zu",sizeof(animals) /sizeof(animals[0]));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.