【发布时间】:2018-06-04 23:29:29
【问题描述】:
在我高中期末考试的练习中,我们得到了以下问题:
在代码执行后查找字符串 s1、s2 和 s3 的值:
char s1[] = "Short Message Service", *s2, *s3;
s2 = strchr(s1, 'M');
s3 = strrchr(s2,'S');
strncpy(s1 + 1, s2, 1);
strcpy(s1 + 2, s3);
全班预期结果为:
s1 = SMService
s2 = Message Service
s3 = Service
当我们通过执行代码对其进行测试时,我们惊讶地看到结果是:
s1 = SMService
s2 = ice
s3 = Service
问题是没有人能弄清楚为什么 s2 被缩短了。在试图弄清楚时,我发现 s2 一直保留着“消息服务”,直到执行“strcpy”函数的最后一行代码。我认为问题可能出在指针地址中,但我无法弄清楚 strcpy 是如何影响 s2 的。
所以我的问题是为什么 s2 不是我们预期的那样,为什么它被缩短了?
【问题讨论】:
-
它似乎被缩短了,因为终止与最后的
strcpy一起被删除。这所有都发生在同一个缓冲区(s1[])中,而调试器会让这一点显而易见。看看s2指向的位置:s1+6。现在看看最后的strcpy后面的s1+6是什么:SMService的尾部字符,那是ice和一个终止符。 -
@WhozCraig 谢谢你的解释。但如果是这样的话(
s2指向:s1+6)s3指向s2+7还是直接指向s1+13?在这两种情况下,s3最终如何等于"Service"? -
s3中存储的地址在分配strrchr结果后永远不会改变,即s1+14没有任何东西通过缓冲区末尾覆盖或更改该地址处的数据,因此s3的渲染在渲染时显示为简单的Service。 -
@WhozCraig 谢谢你,你的解释真的很有帮助!
标签: c pointers strcpy string.h