C strcpy和strncpy组合的意外结果

时间:2018-06-04 23:29:30

标签: c pointers strcpy string.h

在我高中的期末考试中,我们得到了以下问题:

执行代码后查找字符串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不是我们所期望的,为什么它缩短了?

1 个答案:

答案 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