Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 复制字符数组_C - Fatal编程技术网

C 复制字符数组

C 复制字符数组,c,C,通用条款4.4.2 c89 我只是在研究一些指针。但是,使用下面的程序,我无法将源代码复制到目标。即使我尝试在for循环中打印,我也可以显示源代码中的字符,但dest是空的。指针返回时,目标为空。所以它没有复制任何东西 我已经研究这个问题大约一个小时了,只是不清楚为什么它不起作用 有什么建议吗 非常感谢, char str_source[80] = "A string to be for demostration purposes"; char str_dest[80] = {0}; char

通用条款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]=“用于演示的字符串”;
char str_dest[80]={0};
char*my\u strncpy(char*dest,const char const*source,const size\u t size)
{
尺寸i=0;
printf(“大小[%d]\n”,大小);
对于(i=0;i
=============== 编辑

char str_source[80]=“用于演示的字符串”;
char str_dest[80]={0};
printf(“str_dest[%s]\n”,我的strncpy(str_dest,str_source,sizeof(str_dest));
char*my\u strncpy(char*dest,const char const*source,const size\u t size)
{
尺寸i=0;
/*
*递增p并返回将被删除的dest
*数组的开头。
*/
char*p=dest;
/*复制指定数量(通常为dest-1的最大大小)*/
对于(i=0;i
您究竟是如何测试该函数不起作用的?请注意,您的函数正在返回
dest
,它现在指向目标缓冲区的末尾。调用函数是检查返回的指针,还是检查作为目标缓冲区传递的指针

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

顺便说一句,不清楚你打算做什么。如果是目标缓冲区中的字节数,则在写入NUL终止符时可能会使缓冲区溢出


哦,你应该检查你没有读到
source

的结尾。问题是你返回的指针已经递增,并且没有指向起始点。所以,它显示为空白。对于for循环打印,情况似乎也是如此

例如:

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


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

本例中的大小是目标字符串的最大大小。这样目的地就不会超限。我已经用你的更正重新编辑了。但是,如果用户传递的大小无效,那么如果此函数崩溃,我将不承担任何责任。我不确定我是否能做到100%的防白痴。@robUK:不,它会使缓冲区溢出。作为一个简单的例子,假设
size
为1。迭代一次并递增
p
p
现在,当您写入
'\0'
时,它指向目标缓冲区末尾之后的一个元素。即使对于你认为无效的值(大概当<代码>大小<代码>为0)时,你应该失败,而不是溢出一个缓冲区。这就是漏洞攻击的开始。
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;
}