Попытка воссоздать функцию strcpy с помощью указателей - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь выучить указатель, воссоздав функцию strcpy в C. Она перестала работать, когда у меня есть пробел, вкладка во входной строке (что угодно, кроме английского символа).

Может кто-нибудь объяснить, почему? Все ответы приветствуются

#include <stdio.h>

void strcpys(char *s, char *t);
int main() {
    char *ms;
    char *mt;

    mt = "ABCDEFGAAA,AAAAA";
    strcpys(ms, mt);
    printf("%s\n", ms);
    printf("%s\n", mt);
    return 0;
}

void strcpys(char *s, char *t) {
    while ((*s = *t) != '\0') {
        s++;
        t++;
    }
}

1 Ответ

3 голосов
/ 08 мая 2019

Ваша функция 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 имеет неопределенное поведение, если массивы источника и назначения перекрываются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...