试图将一个 char* 复制到另一个 char*

Trying to copy a char* to another char*

我的代码有问题

char* strdup(const char* s)
{
    int n = 0;

    for(; *s != 0; s++)
    {
        n++;
    }

    char* p = new char[n+1];

    for(int i = 0; i < n; i++)
    {
        p[i] = s[i];
    }
    p[n] = 0;

    return p;
}

int main()
{
    const char* p = "testing";

    char* p_copy = strdup(p);

    std::cout << p << '\n' << p_copy << std::endl;

    return 0;
}

没有按预期工作。

我想编写一个接受 const char* 并将其复制到新分配的 char 内存的函数。完成后,它应该 return 指向字符的指针。

现在,当我尝试时,我的输出很简单:

testing

提前感谢您的帮助

在开始将 s 复制到 p 之前,尽量不要递增 s。我注意到在您的第一个 for 循环中,您递增 s 直到它指向空值,然后使用该指针值开始您的字符串复制。难怪你得到一个空字符串。

这里:

for(; *s != 0; s++)

你递增 s。所以它不再指向输入字符串的开头。它指向字符串的空终止符。然后,这里:

for(int i = 0; i < n; i++)
{
    p[i] = s[i];

您尝试从 null 终止符开始复制 n 个字符,但您最终读取了具有未定义行为的数组末尾。

解决方法:复制一份s用于统计字数:

const char* s2 = s;
for(; *s2 != 0; s2++)

更好的是,您可以将长度计数部分重构为一个名为 strlen 的可重用函数。