Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中Strlen()功能的问题 #包括 int main() { 字符arr[]={'g','e','e','k','s'}; printf(“%d%d”、sizeof(arr)、strlen(arr)); 返回0; }_C_Arrays_String_Sizeof - Fatal编程技术网

C中Strlen()功能的问题 #包括 int main() { 字符arr[]={'g','e','e','k','s'}; printf(“%d%d”、sizeof(arr)、strlen(arr)); 返回0; }

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

我得到的输出是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 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()在这种情况下的行为吗”-家庭作业告诉我们。