复制一个字符数组

时间:2010-01-24 07:56:43

标签: c

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;
}

=============== 修改

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 个答案:

答案 0 :(得分:4)

究竟你是如何测试该功能不起作用的?请注意,您的函数返回dest,现在指向目标缓冲区的 end 。调用函数是检查返回的指针,还是检查它作为目标缓冲区传递的指针?

出于类似的原因,循环中printf的{​​{1}}无效;此时您已经增加*dest,因此它指向下一个未使用的位置。 (对dest的{​​{1}}调用也会打印要复制的下一个字符,而不是您刚刚复制的字符。)

顺便说一句,目前还不清楚你打算printf是什么意思。如果它是目标缓冲区中的字节数,则在编写NUL终结符时可能会溢出缓冲区。

哦,你应该检查一下你是否在source结束时阅读。

答案 1 :(得分:3)

问题是你返回的指针已经递增并且没有指向开头。所以,它显示为空白。您的for循环打印也是如此。

对于Ex:

假设您的初始目标地址为1000,源字符串大小为20,那么您的destnation返回1020.但实际上它应该返回1000.

尝试将目标的初始地址存储在本地变量中并返回该目的地。