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

Concatenating two strings iteratively in C++

本文关键字:两个 字符串 连接 C++ 迭代 方式      更新时间:2023-10-16

我知道在SE中有一个字符串连接问题被问死了。但据我所知,我已经经历了所有可以帮助我的问题,但徒劳无功。

这就是我希望通过这个程序实现的目标:

最初我有 a=0 和 b=1,分别为 n=0 和 n=1。

对于下一个输入,即从 n=3 开始,我的结果应该是前两个字符串的连接。(就像斐波那契数列一样;只有加法被串联取代)

因此,例如:
对于 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;

}

我做错了什么?

strcat(b,a);调用

未定义的行为,因为b指向字符串文字。

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

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

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

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

为避免此问题,您应该切换到使用 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;
char *a="0";
char *b="1";
"

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

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

噗。

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

您已将ab声明为

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

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

您正在使用strcat但目标字符串是字符串文本。 然后,strcat尝试写入终止空字符的字符串,这就是 seg 错误出现的地方。只是根本不尝试修改字符串文字。由于你可以奢侈地使用C++除非这是一个学习练习,否则你最好使用 std::string。

你可以改用这段代码,我向你展示你需要考虑 n = 1, 2 的初始值此外,您应该处理 n <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;

}