Я пытался сделать strcpy
себя. Это должно работать, я даже скопировал и вставил (почти точный код) из чьего-то поста здесь о strcpy
, Оба дают мне «Ошибка сегментации».
char* strcpy(char * destination, const char * source)
{
while( (*destination++ = *source++) != '\0' )
;
return destination;
}
Что не так с этим кодом?
char* a = "hello";
cout << strcpy(a, "Haha") << endl;
Вы пытаетесь записать в сегмент данных, так как "hello"
хранится там.
Поэтому, когда вы звоните strcpy
Вы получаете ошибку сегментации.
Пытаться:
char a[] = "hello";
cout << strcpy(a, "Haha") << endl;
вместо.
РЕДАКТИРОВАТЬ: Внутри вашего strcpy
функция после копирования, destination
будет указывать на конец строки, вам нужно вместо этого вернуть начало строки.
Вы пытаетесь переписать строковый литерал. Это вызывает неопределенное поведение. декларировать a
как массив вместо:
char a[] = "hello";
Ваш strcpy
В реализации также есть ошибка (при условии нормальной семантики). Он должен вернуть указатель на начало буфера назначения, а не конца.
a
указатель на строковый литерал:
char* a = "hello";
Попытка изменить строковый литерал — неопределенное поведение. Как предложил Карл, если вы инициализируете массив строковым литералом, он будет работать:
char a[] = "hello" ;
Помимо всего упомянутого выше и ниже о строковых литералах, вы также возвращаете указатель на КОНЕЦ вашей строки, так что даже если вы избежите ошибки сегментации, вы напечатаете «».