C中Strlen()功能的问题 #包括 int main() { 字符arr[]={'g','e','e','k','s'}; printf(“%d%d”、sizeof(arr)、strlen(arr)); 返回0; }
我得到的输出是5 6,我无法理解为什么我得到的是6而不是5,因为字符数组长度是5?要获得C中Strlen()功能的问题 #包括 int main() { 字符arr[]={'g','e','e','k','s'}; printf(“%d%d”、sizeof(arr)、strlen(arr)); 返回0; },c,arrays,string,sizeof,C,Arrays,String,Sizeof,我得到的输出是5 6,我无法理解为什么我得到的是6而不是5,因为字符数组长度是5?要获得字符串的大小,应该使用strlen() strlen();因此请注意,arr的数组大小是5,而str的数组大小是6,而str(strlen)的字符串大小是5 #include <stdio.h> int main() { char arr[]= {'g', 'e', 'e', 'k', 's'}; printf("%d %d", sizeof(arr),strlen(arr)); return
字符串的大小,应该使用strlen()
strlen();因此请注意,arr
的数组大小是5
,而str
的数组大小是6
,而str
(strlen
)的字符串大小是5
#include <stdio.h>
int main()
{
char arr[]= {'g', 'e', 'e', 'k', 's'};
printf("%d %d", sizeof(arr),strlen(arr));
return 0;
}
当你写chararr[]={'g','e','e','k','s'}
然后你有一个字符数组,因此sizeof(arr)
给出了arr的长度,以字节为单位,即5。但是当你写char-arr[]=“极客”代码>您将在arr的末尾自动有一个“\0”字符,因此arr的大小为6字节。根据C标准(7.1.1术语定义)
1字符串是以和结尾的连续字符序列
包括第一个空字符
及
…字符串的长度是null前面的字节数
性格
函数strlen
(7.23.6.3 strlen函数)统计空字符前面的字符数组中的字符数:
2 strlen函数计算
美国
至于sizeof
操作符(6.5.3.4操作符的sizeof和alignof)
2 sizeof运算符生成其操作数的大小(以字节为单位),其中
可以是表达式或类型的括号名称。尺寸是
根据操作数的类型确定
此声明声明的字符数组大小由初始值设定项的数量决定
sizeof arr 5
sizeof str 6
strlen str 5
根据C标准(6.7.9初始化)
22如果初始化了未知大小的数组,则确定其大小
通过具有显式初始值设定项的最大索引元素
所以这个数组正好有5个元素。根据sizeof
运算符表达式的定义,其类型为char[5]
abd
char arr[]= {'g', 'e', 'e', 'k', 's'};
sizeof(arr),
sizeof(arr),
生成其操作数arr
的大小(以字节为单位),即5
数组不包含空字符。因此,函数strlen
无法计算空字符前面的字节数。在这种情况下,其行为是未定义的。它将对数组之外的所有字节进行计数,直到对空字符进行计数。这样表达
char arr[]= {'g', 'e', 'e', 'k', 's'};
sizeof(arr),
sizeof(arr),
可以产生任何大于5的结果
例如,可以使用字符串文本初始化数组
strlen(arr)
在这种情况下,数组也由字符串文本的空字符初始化。此初始化相当于
char arr[]= {"geeks"};
在本例中,数组的大小
char arr[]= {'g', 'e', 'e', 'k', 's', '\0'};
等于6。由于数组具有空字符表达式
char arr[]= {'g', 'e', 'e', 'k', 's'};
sizeof(arr),
sizeof(arr),
将精确计算空字符前面的5个字符。1。那不是一根绳子。2.您没有使用strlen(这很好,因为…1)。“我得到的输出为5 6”不,您没有。您得到的输出为5。也就是说,%d
对于sizeof
结果是错误的格式说明符,因此我认为它可能是UD。(还要注意,sizeof
不是一个函数,不需要()
)您应该使用%zu
,因为它为size\t
@CoolGuy:指定了正确的格式说明符,或者使用%d
并强制转换为int
:printf(%d\n',(int)sizeof arr)
但是是的,%zu
更好(除非你被一个不支持它的古老的实现卡住了)。@t.J.Crowder:UD
是什么意思?你的意思是UB
?在这种情况下没有'\0',那么会发生什么,编译器会继续搜索'\0',这样你才能清楚地解释strlen()在这种情况下的行为。@user3290550:编译器不会做任何事情。它生成的代码将开始搜索char[]
数组,并继续搜索,直到A)您在访问不应访问的内存时遇到segfault,或B)它找到\0
。对于未显式以null结尾的内存块,strlen
的行为未定义。但是,你知道,它不会有用的。:-)那么为什么只有6,也可以是7,你能看看代码吗again@user3290550具有未显式以null结尾的内存块的strlen的行为未定义。这意味着它可以是任何东西,6
或7
或halo
[叹气]“你能清楚地解释一下strlen()在这种情况下的行为吗”-家庭作业告诉我们。