Я программист Java, пытающийся забрать C. В частности, я пытаюсь понять strcat(). Если я позвоню:c strcat перезаписать исходную строку?
strcat(dst, src);
Я получаю, что strcat() изменит мою строку dst. Но не следует ли оставить строку src в одиночку? Рассмотрим следующий код:
#include<stdio.h>
#include<string.h>
void printStuff(char* a, char* b){
printf("----------------------------------------------\n");
printf("src: (%d chars)\t\"%s\"\n",strlen(a),a);
printf("dst: (%d chars)\t\"%s\"\n",strlen(b),b);
printf("----------------------------------------------\n");
}
int main()
{
char src[25], dst[25];
strcpy(src, "This is source123");
strcpy(dst, "This is destination");
printStuff(src, dst);
strcat(dst, src);
printStuff(src, dst);
return 0;
}
Который производит этот выход на моей коробке Linux, компиляции с GCC:
----------------------------------------------
src: (17 chars) "This is source123"
dst: (19 chars) "This is destination"
----------------------------------------------
----------------------------------------------
src: (4 chars) "e123"
dst: (36 chars) "This is destinationThis is source123"
----------------------------------------------
Я предполагаю, что полный «Это source123» Строка еще находится в памяти и strcat() переместил указатель char * src вперед на 13 символов. Но почему? Почему 13 символов? Я играл с длиной строки dst, и это определенно влияет на указатель src после выполнения strcat(). Но я не понимаю, почему ...
Также ... как бы вы отлаживали это, в GDB, сказать? Я попробовал «шаг», чтобы войти в функцию strcat(), но я предполагаю, что эта функция не была проанализирована отладчиком; «Шаг» ничего не делал.
Спасибо! -ROA
PS - Однократное замечание. Я прочитал подобные сообщения strcat() на этом сайте, но не увидел тот, который, казалось, напрямую касался моего вопроса. Извиняюсь, если я пропустил пост, который сделал.
«Я предполагаю, что полный» Это источник123 «Строка по-прежнему в памяти» -> возможно. Когда код воспроизводится вне его песочницы (записывать границы внешнего массива), все может случиться - неопределенное поведение (UB). Не ожидайте «Но не стоит ли оставлять строку src?» Результаты и объяснения могут иметь смысл сегодня, но завтра результаты могут отличаться. – chux
Вы только выделили 'char [25]' for 'dst'. Как вы ожидаете, что там будет 37 символов (включая конечный нуль)? – user2357112
'src' +' dst' concatenated имеют больше, чем 24 + 1 символ терминатора, который вы выделили с помощью 'dst [25]' –