Ваша функция strcpys
в порядке, но функция main
является проблемой:
- аргумент назначения, переданный в
strcpys
, является неинициализированным указателем.Это имеет неопределенное поведение, вполне вероятно, ошибка сегментации.Вместо этого вы должны передать пинтер в char
достаточно большой, чтобы вместить все символы из источника плюс нулевой байт-терминатор.
Вот также некоторые возможные улучшения:
strcpys
должен возвращать указатель назначения - указатель источника должен быть объявлен как
const char *
- имена аргументов должны быть менее запутанными
Вотисправленная версия:
#include <stdio.h>
char *strcpys(char *dest, const char *src);
int main() {
char ms[32];
const char *mt = "ABCDEFGAAA,AAAAA";
strcpys(ms, mt);
printf("%s\n", ms);
printf("%s\n", mt);
return 0;
}
char *strcpys(char *dest, const char *src) {
char *p = dest;
while ((*p = *src) != '\0') {
p++;
src++;
}
return dest;
}
Обратите внимание, что вы можете объединить приращения в присваивании:
char *strcpys(char *dest, const char *src) {
char *p = dest;
while ((*p++ = *src++) != '\0')
continue;
return dest;
}
Обратите внимание, что обе версии имеют неопределенное поведение, если указатель назначения указывает внутри строки источника.Функции ведут себя ожидаемым образом, если массив и источник назначения не перекрываются или если адрес назначения находится по более низкому адресу, чем строка источника.Стандартная функция strcpy
имеет неопределенное поведение, если массивы источника и назначения перекрываются.