C 复制字符数组
通用条款4.4.2 c89 我只是在研究一些指针。但是,使用下面的程序,我无法将源代码复制到目标。即使我尝试在for循环中打印,我也可以显示源代码中的字符,但dest是空的。指针返回时,目标为空。所以它没有复制任何东西 我已经研究这个问题大约一个小时了,只是不清楚为什么它不起作用 有什么建议吗 非常感谢,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
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;
}