在C ++中迭代连接两个字符串

时间:2012-08-10 20:56:11

标签: c++ string-concatenation

我知道在SE中已经要求串联串联问题死亡。但据我所知,我已经完成了所有可以帮助我的问题,徒劳无功。

这是我希望通过该计划实现的目标:

最初我有一个= 0和b = 1,分别为n = 0和n = 1.

对于下一个输入,即从n = 3开始,我的结果应该是前两个字符串的连接。 (就像Fibonacci序列一样;只有加法被连接替换)

所以,例如:
对于n = 3,我的输出应为“10” 对于n = 4,我的输出应为“101”
对于n = 5,我的输出应为“10110”

我编写的代码没有逻辑问题,但我收到了SIGSEGV错误,我不明白为什么。

#include <iostream>
#include<new>
#include<string.h>

using namespace std;

int main()
{
    long int n,i;
    char *a="0";
    char *b="1";
    char *c=new char[100000];

cout<<"Enter  a number n:";
cin>>n;

for(i=0;i<n;i++)
{

    strcat(b,a);
    strcpy(a,b);

}
cout<<"\nRequired string="<<b;

}

我做错了什么?

6 个答案:

答案 0 :(得分:6)

strcat(b,a);调用未定义的行为,因为b指向字符串文字。

char * strcat ( char * destination, const char * source );
  

连接字符串   将source字符串的副本附加到destination字符串。

由于这是C ++,我建议您使用std::string+运算符。或std::stringstream

答案 1 :(得分:3)

您正在观察的问题与未定义的行为有关:您正在写入已分配给字符串文字的内存。

为避免此问题,您应该切换到使用C ++ std::string:通过将内存管理排除在外,它可以使您的代码更加简单。

string a("0");
string b("1");
int n = 10;
for(int i=0;i<n;i++) {
    string tmp(a);
    a = b;
    b = tmp + b;
}
cout<<"Required string="<<b;

答案 2 :(得分:1)

char *a="0";
char *b="1";

“0”和“1”是string-literals(a的地址为“0”,b的地址为“1”),其包含的变化为undefined behaviour

strcat(b,a);
strcpy(a,b);

UB。

由于您使用C ++更好地使用std::stringstd::stringstream

答案 3 :(得分:0)

您已将ab声明为

char *a="0"; 
char *b="1";

这些是指向常量字符串的指针。这意味着分配给这些指针的内存是固定的。当你写过这块内存时,会发生Bad Things(TM)。

答案 4 :(得分:0)

您正在使用strcat,但您的目标字符串是字符串文字。然后strcat尝试写入终止空字符的字符串,这就是seg错误的来源。只是不要尝试修改字符串文字。既然你有使用C ++的奢侈,除非这是一个学习练习,你最好使用std :: string。

答案 5 :(得分:0)

您可以使用此代码,我向您展示您需要考虑n = 1,2的初始值 你应该处理错误的输入n&lt; 0 并且避免动态分配,因为你似乎没有明显的原因使用new,你忘了在最后用删除释放内存。

#include <iostream>
#include<new>
#include<string.h>

using namespace std;

int main()
{
    long int n,i;
    char a[10];
    char b[10];
    char c[10];
    //char *c=new char[100000];
    cout<<"Enter  a number n:";
    cin>>n;

    strcpy(a, "0");
    strcpy(b, "1");

    if (n == 1)
        strcpy(b, a);
    else if (n > 2)
    {
        for(i=2;i<n;i++)
        {
            strcpy(c, a);
            strcat(c, b);
            strcpy(a, b);
            strcpy(b,c);
        }
    }
    else if (n != 2)
        cout<<"\nInvalid input!";

    cout<<"\nRequired string="<<b;

}