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;
}
答案 0 :(得分:4)
究竟你是如何测试该功能不起作用的?请注意,您的函数返回dest
,现在指向目标缓冲区的 end 。调用函数是检查返回的指针,还是检查它作为目标缓冲区传递的指针?
出于类似的原因,循环中printf
的{{1}}无效;此时您已经增加*dest
,因此它指向下一个未使用的位置。 (对dest
的{{1}}调用也会打印要复制的下一个字符,而不是您刚刚复制的字符。)
顺便说一句,目前还不清楚你打算printf
是什么意思。如果它是目标缓冲区中的字节数,则在编写NUL终结符时可能会溢出缓冲区。
哦,你应该检查一下你是否在source
结束时阅读。
答案 1 :(得分:3)
问题是你返回的指针已经递增并且没有指向开头。所以,它显示为空白。您的for循环打印也是如此。
对于Ex:
假设您的初始目标地址为1000,源字符串大小为20,那么您的destnation返回1020.但实际上它应该返回1000.
尝试将目标的初始地址存储在本地变量中并返回该目的地。