我的memcpy有什么问题?

时间:2010-08-07 19:09:46

标签: c++

我编写了一个实现memcpy

的函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
char *memcpy(char *dest,char *src,int n){

    char *ch=dest;
    while (n--)
        *ch++=*src++;
    return  dest;
}

int main(){

    char *src="georgia";
    int n=strlen(src);
    char *dest=new char[n];
    std::cout<<*memcpy(dest,src,n)<<std::endl;
    return 0;
}

但它只打印一个g。为什么呢?

4 个答案:

答案 0 :(得分:13)

因为你要打印一个角色。

std::cout<<*memcpy(dest,src,n)<<std::endl;

取消引用目标缓冲区(*memcpy),因此返回字符串的第一个字符(g)。你应该没问题:

std::cout << memcpy(dest, src, n) << std::endl;

除此之外,它仍然无法工作:您需要在副本中包含字符串的终止NULL字符,但strlen从字符串的长度中排除它;所以你的缓冲区缺少1个字符。你需要在n加1来平衡它,一切都应该没问题。

int n = strlen(src) + 1;

答案 1 :(得分:3)

memcpy函数没有错,但你对结果有*操作。如果我们打破打印线,它就是......

char * result = memcpy(dest,src,n);
std::cout << *result << std::endl;

你真的想......

std::cout << memcpy(dest,src,n) << std::endl;

答案 2 :(得分:3)

您的memcpy()会返回指向char的指针。在行

std::cout<<*memcpy(dest,src,n)<<std::endl;

您取消引用指针(使用运算符*),以便有效地向流发送一个char(返回值指向的那个)。

您的代码中存在错误。 strlen返回字面“georgia”中的字符数,但不包含终止空字符。您应该将n增加1,为dest分配适当的存储空间,并复制终止空字符。

答案 3 :(得分:2)

您正在取消引用char *,这是一个char。这将是第一个角色,g。