在我高中的期末考试中,我们得到了以下问题:
执行代码后查找字符串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不是我们所期望的,为什么它缩短了?
答案 0 :(得分:2)
在您的代码中,s2
指向M
中的s1
,然后被s3
中的strcpy
覆盖:
char s1[] = "Short Message Service", *s2, *s3;
s2 = strchr(s1, 'M'); // s2 is pointing to s1 + 6 = Message Service
s3 = strrchr(s2, 'S'); // s3 is pointing to s1 + 14 = Service
strncpy(s1 + 1, s2, 1); // Write M in to s1[1], s1 = SMort Message Service
strcpy(s1 + 2, s3); // Write Service into s1 + 2
// s1 = SMService but s2 is pointing to s1 + 6 = ice