#include<iostream>
using namespace std;
char *concat(char *string1,char *string2)
{
char *stringfinal=new char[strlen(string1)+strlen(string2)+2];
stringfinal=string1;
char *dest=new char[strlen(string1)+strlen(string2)+2];
dest = stringfinal;
while(*dest != '\0')
{
dest++;
}
*dest=' '; // Point 1
while(*string2 != '\0')
*dest++=*string2++; //Point2
*dest='\0';
return stringfinal;
}
int main()
{
char *str1="Anurag";
char *str2="Jain";
char *strfinal = new char[strlen(str1)+strlen(str2)+2];
strfinal=concat(str1,str2);
cout<<strfinal;
cin.get();
}
答案 0 :(得分:4)
你的问题是你似乎认为
stringfinal=string1
和
dest = stringfinal;
正在进行字符串拷贝,而实际上它们只是重新分配dest
和stringfile
指针以指向其他地方(并立即丢失你刚才新的内存)。
您可能需要strcpy(stringfile, string1)
。
即使修复了这个错误,这也不是人们现在编写C ++的方式的一个非常光辉的例子。你几乎肯定会更好地使用std :: string,它可以为你正确地完成所有这些字符串/指针/分配的东西,让你考虑更重要的东西。
但是如果你只是想了解内置字符串类背后的内容,那么对你有更多的权力......
答案 1 :(得分:3)
我看到的第一个问题是第二行:
char *stringfinal=new char[strlen(string1)+strlen(string2)+2];
stringfinal=string1; //problematic line
首先分配内存,变量stringfinal
保存此内存。然后用string1
保留的内存覆盖此变量。你新分配的内存消失了,问题就从这里开始,第二行。
此处也有类似的错误:
char *dest=new char[strlen(string1)+strlen(string2)+2];
dest = stringfinal;
dest
保留的新分配的内存在您使用stringfinal
覆盖它的那一刻就消失了。
无论如何,您应该使用std::string
作为:
std::string string1;
std::string string2;
//...
std::string stringfinal = string1 +" " + string2;
如果不是std::string
,您应该使用std::strcpy
和std::strcat
而不是手动循环,因为:
char *concat(char *string1,char *string2)
{
char *stringfinal=new char[strlen(string1)+strlen(string2)+3];
std::strcpy(stringfinal,string1); //^^^ note this!
std::strcpy(stringfinal, " ");
std::strcat(stringfinal,string2);
return stringfinal;
}
答案 2 :(得分:1)
由于您标记了问题c++
:
int main()
{
const std::string str1("Anurag");
const std::string str2("Jain");
const std::string strfinal(str1 + str2);
std::cout << strfinal;
return 0;
}
答案 3 :(得分:0)
不幸的是,您的代码存在许多问题。我真的不知道从哪里开始。
我只是概述应该做什么?
new
大到足以容纳字符串和终止\0
。string1
将每个字符复制到新数组string2
将每个字符复制到新数组但是,由于你使用的是c ++,我建议使用实际的字符串。你上面的内容实际上是C new
编辑:此外,您不会在通话中 分配空间,而是将其存储在指针中:
char *strfinal = concat(str1,str2);
答案 4 :(得分:0)
char *stringfinal=new char[strlen(string1)+strlen(string2)+2];
stringfinal=string1;
您从大小为strlen(string1)+strlen(string2)+2
的免费商店中获取了内存。可能是额外的2,我假设空间和终止角色。在下一个语句中,您使stringfinal
指向string1
,导致内存泄漏。通过之前的new
语句获取的内存是以无人访问的自由方式进行的。和下一个陈述一样。
char *dest=new char[strlen(string1)+strlen(string2)+2];
dest = stringfinal;
因此,最后dest
指向string1
的位置,而*dest = ' '; // Point 1
指向所指向的只读位置。并且您正尝试使用语句
char *str1="Anurag";
char *str2="Jain";
导致崩溃的原因。
str1, str2
两个concat
都指向只读位置,并且您将它们作为参数传递给new
函数。此外,每个delete/delete[]
都应与delete[]
相关联,在您的情况下,它应为{{1}}。
答案 5 :(得分:0)
男人所有那些记忆分配是什么,让我疯狂,这是你的工作代码,需要做一些改变:
#include<iostream>
#include<cstring>
using namespace std;
char * concat(char *string1,char *string2,char *stringfinal)
{
char *p = stringfinal;
while(*(p++)=*(string1++));
p--;
*p=' ';
p++;
while(*(p++)=*(string2++));
return stringfinal;
}
int main()
{
char *str1="Anurag";
char *str2="Jain";
char *stringfinal=new char[strlen(str1)+strlen(str2)+2];
stringfinal=concat(str1,str2,stringfinal);
cout << stringfinal << endl;
}
答案 6 :(得分:0)
首先,这是错误的:
stringfinal=string1;
它不会按照您的想法执行,而是使用strcpy(stringfinal,string1) 其次,移动指针并不是一个好的编程方法,因为你会失去你的起点。相反,您可以将其复制到另一个指针并增加副本。 你想要做的事情(我假设你想要自己串起来)可以通过以下方式完成
char* dest = new char[strlen(str1)+strlen(str2)+1];
int i=0;
while(str1[i] != '\0')
{
dest[i] = str1[i];
i++;
}
int j=0;
while(str2[j] != '\0')
{
dest[i] = str2[j];
i++;
j++;
}
dest[i] = '\0';
return dest;