C 为什么在这个实例中strlen()返回的数字比我预期的少一个?
例如:C 为什么在这个实例中strlen()返回的数字比我预期的少一个?,c,strcat,C,Strcat,例如: { int a,b; char s1[]="ABCDEF"; char s2[]="ZWXYZ"; strcpy(s1,s2); strcat(s1,"L#@"); a=strlen(s1); b=strlen(s2); printf("%d%d",a,b); } 返回8和5。我希望斯特伦9点回来。我想#或@一定是这里的罪魁祸首。但是,当我删
{
int a,b;
char s1[]="ABCDEF";
char s2[]="ZWXYZ";
strcpy(s1,s2);
strcat(s1,"L#@");
a=strlen(s1);
b=strlen(s2);
printf("%d%d",a,b);
}
返回8和5。我希望斯特伦9点回来。我想#或@一定是这里的罪魁祸首。但是,当我删除#时,它返回7,就好像#已被计数一样。所以,斯特伦似乎返回了我所期望的结果,但却是负一。这是怎么回事?当你说
strcat(s1,"L#@");
连接的字符串(结果)太长,无法放入s1
。它超出了有效边界,并且作为一个reuslt,您有
您需要确保连接的结果可以保存到目标内存中。换句话说,您需要确保s1
足够大,可以容纳
strcat(s1,"L#@");
实现这一点的基本方法是通过在编译时指定大小使目标足够大,比如
#define SIZE 16
....
char s1[SIZE]="ABCDEF";
然后,相应地使用它
在这里,我们只是将s1
设置得足够大,以容纳串联的结果
也就是说,strlen()
的返回类型是size\u t
,因此您应该使用%zu
打印结果 当你说
strcat(s1,"L#@");
连接字符串(结果)太长,无法适应s1
。它超出了有效边界,并且作为一个reuslt,您有
您需要确保连接的结果可以保存到目标内存中。换句话说,您需要确保s1
足够大,可以容纳
strcat(s1,"L#@");
实现这一点的基本方法是通过在编译时指定大小使目标足够大,比如
#define SIZE 16
....
char s1[SIZE]="ABCDEF";
然后,相应地使用它
在这里,我们只是将s1
设置得足够大,以容纳串联的结果
也就是说,
strlen()
的返回类型是size\u t
,因此您应该使用%zu
打印结果 忽略这样一个事实,即您正在写入超过字符串结尾的内容
在strcpy(s1,s2)之后s1包含“ZWXYZ”
strcat(s1)之后,“L#@”)
s1包含长度为ogf 8的“ZWXYZL#@”,忽略写入超过字符串结尾的事实
在strcpy(s1,s2)之后s1包含“ZWXYZ”
在
strcat(s1,“L#@”)之后
s1包含长度为ogf 8的“ZWXYZL#@”,您在s1
末尾写入。是UB。没有意义。你有未定义的行为定义chars1[]=“ABCDEF”代码>等于字符s1[7]={A',B',C',D',E',F','\0'}与其他编程语言不同,C没有字符串类型。它使用低级字符数组。它们的所有内存分配都必须手动完成。未能理解这一点是来自其他编程语言的人犯下的一个典型错误。即使没有未定义的行为,为什么期望它是9?您将s1
的内容替换为长度为5的s2
,然后在末尾追加3个字符。您的写入超过了s1
的末尾。是UB。没有意义。你有未定义的行为定义chars1[]=“ABCDEF”代码>等于字符s1[7]={A',B',C',D',E',F','\0'}与其他编程语言不同,C没有字符串类型。它使用低级字符数组。它们的所有内存分配都必须手动完成。未能理解这一点是来自其他编程语言的人犯下的一个典型错误。即使没有未定义的行为,为什么期望它是9?您可以将s1
的内容替换为长度为5的s2
,然后在末尾附加3个字符。您好,谢谢您的回答。这是我期中练习的一个问题。我想我会在实际的期中考试中看到这些问题。我该怎么回答这个问题呢?因为正确答案(根据我的教授)是a=8和b=5;不是未定义的行为。@LtLame如果你的教授真的说他非常不称职(不仅不知道事情,而且知道错误的事情并教他们)。@LtLame如果你分配足够的内存,情况会是这样。@Art你不能这么说,可能教授没有看这个代码。嗨,谢谢你的回答。这是我期中练习的一个问题。我想我会在实际的期中考试中看到这些问题。我该怎么回答这个问题呢?因为正确答案(根据我的教授)是a=8和b=5;不是未定义的行为。@LtLame如果你的教授真的说他非常不称职(不仅不知道事情,而且知道错误的事情并教他们)。@LtLame如果你分配足够的内存,情况会是这样。@Art你不能这么说,可能教授没有看这段代码。