尝试连接两个字符串时崩溃

时间:2011-04-23 18:30:58

标签: c++

#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();

}

7 个答案:

答案 0 :(得分:4)

你的问题是你似乎认为

stringfinal=string1

dest = stringfinal;

正在进行字符串拷贝,而实际上它们只是重新分配deststringfile指针以指向其他地方(并立即丢失你刚才新的内存)。

您可能需要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::strcpystd::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;