неожиданный результат в комбинации C strcpy и strncpy - PullRequest
0 голосов
/ 05 июня 2018

При подготовке к выпускному экзамену в моей школе у ​​нас возник следующий вопрос:

Найти значения строк 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 голосов
/ 05 июня 2018

В вашем коде 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
...