尝试连接两个字符串时崩溃
Crash while trying to concatenate two strings
#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 != ' ')
{
dest++;
}
*dest=' '; // Point 1
while(*string2 != ' ')
*dest++=*string2++; //Point2
*dest=' ';
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();
}
你的问题是你似乎认为
stringfinal=string1
和
dest = stringfinal;
正在执行字符串副本,而它们实际上只是重新签名dest
并stringfile
指针指向其他地方(并立即丢失您刚刚新增的内存(。
您可能想要strcpy(stringfile, string1)
。
即使修复了这个错误,这也不是当今人们编写C++方式的一个非常光辉的例子。 你几乎肯定会更好地使用 std::string,它会为你正确地完成所有这些字符串/指针/分配工作,让你考虑更重要的事情。
但是,如果您只是想了解内置字符串类背后的内容,那么对您来说,更多的功能......
我看到的第一个问题是这里的第二行:
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;
}
既然你标记了你的问题c++
:
int main()
{
const std::string str1("Anurag");
const std::string str2("Jain");
const std::string strfinal(str1 + str2);
std::cout << strfinal;
return 0;
}
不幸的是,
您的代码有很多问题。我真的不知道从哪里开始。
我只是概述你应该做什么怎么样?
- 创建一个新的字符数组,其
new
足够大,以容纳字符串和终止