C++ 不使用标准库复制字符串
我这里有个问题,我不明白这里出了什么问题。我这里有以下代码:C++ 不使用标准库复制字符串,c++,C++,我这里有个问题,我不明白这里出了什么问题。我这里有以下代码: #include <stdio.h> #include <stdlib.h> #include <string.h> void copyFrom(char * mStr, char * str); int main() { char * srcStr = "Robert bought a good ford car"; char * dstStr = NULL;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void copyFrom(char * mStr, char * str);
int main() {
char * srcStr = "Robert bought a good ford car";
char * dstStr = NULL;
copyFrom(srcStr, dstStr);
printf("The string copied here is %s", dstStr);
return 0;
}
void copyFrom(char * str, char * mStr)
{
if(!mStr) {
mStr = (char *)malloc((strlen(str)) + 1);
if(mStr == NULL)
return;
}
while(*mStr++ = *str++) {
;
}
mStr[strlen(str)] = '\0';
}
这不会复制字符串,但如果对dstStr使用数组而不是字符指针,则一切正常
您能告诉我这里出了什么问题吗?DSTSR没有分配,所以您不能将数据放在任何地方。 使用malloc分配适当的内存块,然后进行复制 它与数组一起工作的原因是字符串存储在堆栈上,并自动为其分配内存
这也是C不C++,因为C++的字符串HANLIGN是通过STD::String。
< p>在Malc之后,需要返回MSTR的值。现在,当您退出函数时,malloc的返回值和指向字符串副本的指针将消失。它从malloc泄漏内存,因为它无法跟踪它 将函数更改为char*copyFrom(const char*str)
然后从该函数返回mStr。然后您可以编写dstStr=copyFrom(srcStr)
现在,POSIX C已经有了这个功能。它被称为strdup
char * dstStr = NULL;
copyFrom(srcStr, dstStr);
printf("The string copied here is %s", dstStr);
dstStr
为空,第一行设置它。当copyFrom
分配字符串时,它不会将该字符串返回给调用者。所以您的printf
会得到一个空值。您可以这样做
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void copyFrom(char * mStr, char * str);
int main() {
char * srcStr = "Robert bought a good ford car";
char * dstStr = NULL;
dstStr = (char *)malloc((strlen(srcStr)) + 1);
copyFrom(srcStr, dstStr);
printf("The string copied here is %s", dstStr);
return 0;
}
void copyFrom(char * str, char * mStr)
{
while(*mStr++ = *str++) {
;
}
mStr[strlen(str)] = '\0';
}
#包括
#包括
#包括
作废copyFrom(char*mStr,char*str);
int main(){
char*srcStr=“罗伯特买了一辆好的福特汽车”;
char*dstStr=NULL;
dstStr=(char*)malloc((strlen(srcStr))+1;
copyFrom(srcStr,dstStr);
printf(“此处复制的字符串为%s”,dstStr);
返回0;
}
void copyFrom(char*str,char*mStr)
{
而(*mStr++=*str++){
;
}
mStr[strlen(str)]='\0';
}
您可以通过引用传递dest,而不是返回:
void copyFrom(const char * src, char *& dest);
int main() {
char * srcStr = "Robert bought a good ford car";
char * dstStr = 0;
copyFrom(srcStr, dstStr);
printf("The string copied here is %s", dstStr);
return 0;
}
void copyFrom(char * str, char *& mStr)
{
if(!mStr) {
mStr = (char *)malloc((strlen(str)) + 1);
if(mStr == NULL)
return;
}
char* it = mStr;
while(*it++ = *str++)
{
;
}
*it = 0;
}
在C语言中,偶数指针是按值传递的。当您传递一个指向函数的指针时,函数将收到一个副本,即一个新指针,它指向调用函数中的指针所在的位置 因此,在您的代码中,当您传递
dstStr
时,您传递的是一个空指针mStr
是一个新的空指针。当您为mStr
分配内存时,此内存分配给此新指针,而不是dstStr
。因此,当函数返回时,调用函数中的dstStr
仍然为NULL,并且没有任何内容指向在copyFrom()中分配的内存。你有内存泄漏
您需要将dststr()
作为两级指针传递,以便更改它在调用函数中指向的内容:
void copyFrom(char * str, char **dstStr)
{
char* mStr;
mStr = (char *)malloc((strlen(str)) + 1);
if(mStr == NULL)
return;
while(*mStr++ = *str++) {
;
}
mStr[strlen(str)] = '\0';
*dststr = mStr;
return;
}
当然,您的函数声明和调用也需要相应地更改。您的调用需要将&dstStr
作为参数传递,而不仅仅是dstStr
他需要。。。查看copyFrom
的前两行,但该内存在函数结束时丢失。如果它向函数传递了一个字符**,那么它就可以工作了。正确的答案是有效的prototype@Zan啊..我误解了来源/目的地。谢谢你删除了错误的答案。这修复了它。谢谢。您正在复制字符串。问题是mStr
被重新分配为指向一个本地值。它本身通过值传递,这对调用者中的dstStr
没有影响。如果您将其作为char*&mStr
传递,它应该可以工作。您还可以将函数更改为“void copyFrom(char*mStr,char**str);”并用copyFrom(srcStr,&dstStr)调用它代码> @戴维施瓦兹,它是C++代码。因为您改变了指针<代码> dSTSTR ,另一种方法可以用来读取:NOPE,问题是他MaloC与OUTU重新排列了EMALLATE数据,见@ ZANLYNXanswer@JoelFalcou:ZanLynx只是众多解决方案中的一种。通过引用(或指针指向指针)传递的代码< > dSTSTR < /COD>也将解决这个问题。如果我们必须涉足引用,然后C++,那么OP BETeTR使用STD::String;