为了账号安全,请及时绑定邮箱和手机立即绑定

​252、若有以下定义和语句: char

​252、若有以下定义和语句: char

C
包小龙虾 2018-09-10 20:13:35
252、若有以下定义和语句: char *s1="12345",*s2="1234"; printf("%d\n",strlen(strcpy(s1,s2))); 则输出结果是 A) 4 B)5 C)9 D)10
查看完整描述

1 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

这题目又错了!

准确的答案是:这代码的结果是未定义的。  实际上,这段代码在运行时极有可能会崩溃。


原因就出在 strcpy(s1, s2) 这里,这个函数会把 s2 所指的字符串(包括结尾的null字符)复制到 s1 所指的字符串中。

但这题目的 s1 所指的是字符串字面量,字符串字面量是不可修改的!按 C 标准的说法,就是“修改它的行为是未定义的”。实践中,试图修改字符串字面量有极大的可能引起程序崩溃,所以这段代码不会有任何结果。


我都不想再吐槽了...

其实呢,我明白这题目要考察的知识点是什么。  干脆我把题目修改成正确的吧,然后再讲下结果是啥。

既然题目错在 s1 指向不可修改的字符串了,那就修改成这样: char s1[] = "12345"    这样 s1 就是字符数组了,这次再修改 s1 的内容就没问题了。

那么题目要考的是什么呢?   就是 strcpy 这个函数会把 s2 所指的字符串全部复制过来——包括结尾的null字符——题目想考的点。   还有就是 strcpy 会返回 s1。

s1 中本来有 6 个字符: 1 2 3 4 5 '\0'

strcpy 之后,s1 的内容成了:1 2 3 4 '\0' '\0'     也就是原本的 5 被从 s2 中过来的 null 字符替换了。

strlen 是用来计算字符串中字符个数的函数。参数是字符指针,当然它必须指向某字符串中。函数计算字符个数的方法就是:从参数所指的字符串的位置开始向后数,直到遇到 null 字符,并且 null 字符不计算在内——题目想考的也有这个

这样 strlen(s1) 最终结果是 4。

查看完整回答
反对 回复 2018-09-11
  • 1 回答
  • 1 关注
  • 1311 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信