试图将一个 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
的可重用函数。
我的代码有问题
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
的可重用函数。