C++ 将C样式字符串复制到空闲存储区上分配的内存中?

C++ 将C样式字符串复制到空闲存储区上分配的内存中?,c++,C++,我正在做一个练习,在这个练习中,我必须将一个c样式的字符串复制到空闲存储区分配的内存中。我需要这样做,而不使用订阅和仅仅依靠指针算法。我编写了以下函数- char* str_dup(const char* s) { // count no. of elements int i = 0; const char* q = s; while (*q) { ++i; ++q; } //create an array +1 for terminating 0

我正在做一个练习,在这个练习中,我必须将一个c样式的字符串复制到空闲存储区分配的内存中。我需要这样做,而不使用订阅和仅仅依靠指针算法。我编写了以下函数-

char* str_dup(const char* s)
{
    // count no. of elements
    int i = 0;
    const char* q = s;
    while (*q) { ++i; ++q; }

    //create an array +1 for terminating 0
    char* scpy = new char[i + 1];

    //copy elements to new array
    while (*s)
    {
        *scpy = *s;
        ++s;
        ++scpy;
    }
    *scpy = 0;
    return scpy;
}
函数返回随机字符。但是如果我把它换成这个-

char* str_dup(const char* s)
{
    // count no. of elements
    int i = 0;
    const char* q = s;
    while (*q) { ++i; ++q; }

    //create an array +1 for terminating 0
    char* scpyx = new char[i + 1];
    char* scpy = scpyx;

    //copy elements to new array
    while (*s)
    {
        *scpy = *s;
        ++s;
        ++scpy;
    }
    *scpy = 0;
    return scpyx;
}

它起作用了。有人能解释一下为什么第一个代码不起作用而第二个代码起作用吗?

第一个代码不起作用,因为您返回了
scpy
的最终值,该值在该点指向终止的NUL字符,而不是字符串的开头

一种解决方案是像您所做的那样,保存原始指针的一个副本以返回一些内容


您应该真正使用
strlen()
memcpy()
,它们使这变得更容易,但可能对您来说是禁止的。

第一个代码不起作用,因为您返回了
scpy
的最终值,该值在该点指向终止的NUL字符,而不是字符串的开头

一种解决方案是像您所做的那样,保存原始指针的一个副本以返回一些内容


您应该真正使用
strlen()
memcpy()
,它们使这变得更容易,但它们可能是您的禁区。

在第一种情况下,您将返回0(NULL)。但是在第二种情况下,您返回字符串的起始地址。[OT]正如注释所示,您有子函数:
char*stru dup(const char*s){const int len=str_len(s);char*res=new char[len+1];str_cpy(res,s);return res;}
i
应该是
size\t
而不是
int
。实际上它是多余的,在第一种情况下,a
q-s
给出的值返回0(NULL)。但是在第二种情况下,您返回字符串的起始地址。[OT]正如注释所示,您有子函数:
char*stru dup(const char*s){const int len=str_len(s);char*res=new char[len+1];str_cpy(res,s);return res;}
i
应该是
size\t
而不是
int
。实际上,它是多余的,a
q-s
给出了值,即使库函数对您是禁止的,您也应该在单独的函数中编写函数。您可以测试它们并检查它们是否正确(而
memcpy
strcpy
等效项无论如何都会创建指针的副本-意外地修复了问题)。即使库函数对您是禁止的,您也应该在单独的函数中编写功能。您可以测试它们并检查它们是否正确(而
memcpy
strcpy
等同物无论如何都会创建指针的副本-意外修复问题)。