C++ 将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
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
。实际上它是多余的,在第一种情况下,aq-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
。实际上,它是多余的,aq-s
给出了值,即使库函数对您是禁止的,您也应该在单独的函数中编写函数。您可以测试它们并检查它们是否正确(而memcpy
或strcpy
等效项无论如何都会创建指针的副本-意外地修复了问题)。即使库函数对您是禁止的,您也应该在单独的函数中编写功能。您可以测试它们并检查它们是否正确(而memcpy
或strcpy
等同物无论如何都会创建指针的副本-意外修复问题)。