对于家庭作业,我应该实现string.h库的所有22个函数(2fun2handle)。我已经失去了很多功能,但在尝试实现strcpy时遇到了一些麻烦。
经过相当多的修改,这是我对该功能的尝试:
char *new_strcpy(char *dest, const char *src){
char *copy = (char *) src;
for(; *copy != '\0'; ++copy, ++dest)
*dest = *copy;
return dest;
}
我认为这样可以正常工作。但是,在通过这样一个简单的示例测试我的代码时:
char src[50], dest[50];
new_strcpy(src, "src");
new_strcpy(dest, "dest");
printf("dest: %s\n", dest);
printf("src: %s\n", src);
我的输出最终看起来像这样:
dest: dest$
src: src$$$$
什么时候应该是这样的:
dest: dest
src: src
在实现这个功能之前,我已经通过使用没有问题的指针将src字符串复制到dest字符串..所以我不确定为什么现在这样做。有什么明显的事我做错了吗?另请注意,我已尝试使用while循环并循环直到*copy
为空,并且我已尝试直接循环遍历原始*dest
和*src
参数传入。
答案 0 :(得分:5)
您永远不会使用特殊的零字符将实际字符串标记为已完成:
char *new_strcpy(char *dest, const char *src){
char *copy = (char *) src;
for(; *copy != '\0'; ++copy, ++dest)
*dest = *copy;
*dest=0;
return dest;
}
请注意,您不需要copy
变量,它只是编译器会为您删除的垃圾。
修改:根据要求,不会丢弃strcpy
并且不那么冗长的经典const
函数如下:
char *new_strcpy(char *dest, const char *src)
{
char *ret = dest; // needed to return, useless as this is
while(*dest++ = *src++); // straight byte copy, very unoptimized
//*dest=0; // no longer needed since the copy happens before the check now
return ret; // and return the original buffer (note that you were returning the end)
}