реализация функции strcpy () без использования в C - PullRequest
1 голос
/ 02 мая 2020

Моя задача такова: я должен реализовать функцию strcpy со следующими ограничениями:

  1. Функция должна использовать выражение указателя (*(d+i))
  2. Я должен реализовать ее без использования <string.h>

Я программирую в Visual Studio 2019. Я искал некоторый исходный код в Google и запустил их, но моя программа имеет логическую ошибку. Программа заканчивается сразу, каждый раз. Я не знаю, что я делаю не так. Вот мой код в Visual Studio 2019 на Windows. Пожалуйста, скажите мне, что случилось.

#include <stdio.h>
void strcpy(char*, char*);

int main()
{
    char* sen1 = "Hello";
    char* sen2 = "Friends";

    strcpy(sen1, sen2);

    printf("The result: %s\n", sen1);

    return 0;
}

void strcpy(char* str1, char* str2)
{
    int i = 0;
    while (*(str2 + i) != '\0')
    {
        *(str1 + i) = *(str2 + i);
        i++;
    }
    *(str1 + i) = '\0';
}

Ответы [ 4 ]

3 голосов
/ 02 мая 2020

В дополнение к необходимости предоставить доступное для записи хранилище для sen1, вы также должны проверить, чтобы обеспечить str2 != NULL в вашей функции перед разыменованием str2 (в противном случае, даже если вы исправите все другие ошибки - вероятнее всего, возникнет ошибка segfault) )

Например, в своем коде вы можете определить константу для использования при установке размера sen1 массива (или вы можете выделить хранилище с помощью malloc(), calloc() или realloc() - сохранить на потом). Используя массив, который вы можете использовать, например,

#include <stdio.h>
#include <stdlib.h>

#define MAXC 64     /* if you need a constant, #define one (or more) */
...
int main (void)
{
    char sen1[MAXC] = "Hello";
    char *sen2 = "Friends";

    mystrcpy (sen1, sen2);

    printf ("The result: %s\n", sen1);

}

В вашей функции strcpy убедитесь, что str2 не NULL перед использованием str2 в вашей функции, например

char *mystrcpy (char *dest, const char *src)
{
    char *p = dest;

    if (!src || !dest) {            /* ensure src or dest is not NULL */
        fputs ("error: src or dest parameters NULL in mystrcpy().\n", stderr);
        exit (EXIT_FAILURE);
    }

    do                              /* loop */
        *p++ = *src;                /* copy each char in src to dest */
    while (*src++);                 /* (including the nul-termianting char) */

    return dest;                    /* return pointer to dest */
}

Теперь вы скопируете исходную строку в строку назначения в вашей (переименованной) функции mystrcpy(), получив ожидаемые результаты:

Пример использования / Вывод

$ ./bin/mystrcpy
The result: Friends

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

3 голосов
/ 02 мая 2020

Две проблемы, как минимум:

  1. Строковые литералы недоступны для записи в C. Часто симптомом является cra sh (SIGSEGV).
  2. Вы не можете использовать идентификатор strcpy для своей собственной функции. Используйте другое имя.

Три проблемы с чистым кодом, как минимум:

  1. Превратите int main() в int main(void), чтобы сделать его правильно набранным.
  2. str1 и str2 слишком обобщенные c имена. Они не указывают, какой источник, а какой указатель назначения. Как насчет my_strcpy(char *dest, char *src)?
  3. Я бы использовал size_t i для счетчика индекса вместо int, потому что это тип всех функций длины строки и оператора sizeof return. Это также тип без знака и может копировать действительно длинные строки :-) size_t доступен после #include <stddef.h>.
2 голосов
/ 02 мая 2020

Вы хотите это:

...
char* source = "Hello";
// or char source[] = "Hello";
char destination[1000];      // destination buffer long enough for playing around

my_strcpy(destination, source);

printf("%s\n", destination);   // should print "Hello" if my_strcpy is corect
...

Для остальных прочитайте ответ Дженса.

0 голосов
/ 02 мая 2020

Среди других хороших ответов, касающихся реализации вашей функции strcpy, а не подробного анализа проблемы вашего фактического кода, есть еще один подход:

char * n_strcpy(char * dest, char const * src)
{
    if (dest == NULL || src == NULL)
    {
        return NULL;
    }

    char *ptr = dest;

    while ((*dest++ = *src++));

    return ptr;
}
...