Копирование массива символов - PullRequest
0 голосов
/ 24 января 2010

gcc 4.4.2 c89

Я просто работал над некоторыми указателями. Тем не менее, с помощью программы ниже я не могу заставить ее скопировать источник в место назначения. Даже когда я пытаюсь печатать в цикле for, я могу отображать символы в источнике, но dest пуст. Когда указатель возвращается, место назначения пусто. Так что он ничего не скопировал.

Я занимался этой проблемой около часа, и мне просто не понятно, почему она не работает.

Есть предложения?

Большое спасибо,

char str_source[80] = "A string to be for demostration purposes";
char str_dest[80] = {0};

char *my_strncpy(char *dest, const char const *source, const size_t size)
{
    size_t i = 0;
    printf("size [ %d ]\n", size);

    for(i = 0; i < size; i++)
    {
        printf("i [ %d ]\n", i);

        *dest++ = *source++;
        printf("*source++ [ %c ]\n", *source);
        printf("*dest [ %c ]\n", *dest);
    }
    /* Null terminate */
    *dest++ = '\0';

    return dest;
}

=============== EDIT

char str_source[80] = "A string to be for demostration purposes";
char str_dest[80] = {0};

printf("str_dest [ %s ]\n", my_strncpy(str_dest, str_source, sizeof(str_dest)));


char *my_strncpy(char *dest, const char const *source, const size_t size)
{
    size_t i = 0;
    /*
     * increment p and return the dest which will be
     * the beginning of the array.
     */
    char *p = dest;

    /* Copy the specified amount (normally the max size of dest - 1) */
    for(i = 0; i < size; i++)
    {
    /* Ensure that the source is not overrun. */
    if(*source)
        *p++ = *source++;
    }
    /* Null terminate */
    *p++ = '\0';

    return dest;
}

Ответы [ 2 ]

4 голосов
/ 24 января 2010

Как именно вы проверяете, что функция не работает? Обратите внимание, что ваша функция возвращает dest, которая теперь указывает на end буфера назначения. Вызывающая функция проверяет возвращенный указатель или проверяет указатель, переданный в качестве буфера назначения?

По тем же причинам printf для *dest в вашем цикле бесполезен; Вы уже увеличили dest в этот момент, поэтому он указывает на следующее неиспользуемое местоположение. (При вызове printf для source также печатается символ следующий для копирования, а не тот, который вы только что скопировали.)

Кроме того, неясно, чем вы собираетесь size. Если это число байтов в целевом буфере, вы можете переполнить буфер при записи NUL-терминатора.

О, и вам следует убедиться, что вы не читаете после конца source.

3 голосов
/ 24 января 2010

Проблема в том, что возвращаемый вами указатель был увеличен и не указывает на начало. Таким образом, это выглядит как пустое. То же самое относится и к вашей печати для цикла.

Например:

Допустим, ваш начальный адрес назначения равен 1000, а размер исходной строки равен 20, а затем ваш адрес возвращается 1020. Но на самом деле он должен возвращать 1000.

Попробуйте сохранить начальный адрес получателя в локальной переменной и вернуть его.

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