[英]Concatenating two strings iteratively in C++
我知道在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;
}
我究竟做错了什么?
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
(地址为“0”,b的地址为“1”),其包含的变化是undefined behaviour
。
strcat(b,a);
strcpy(a,b);
UB。
由于您使用C ++更好地使用std::string
或std::stringstream
。
你已声明a
和b
为
char *a="0";
char *b="1";
这些是指向常量字符串的指针。 这意味着分配给这些指针的内存是固定的。 当你写过这块内存时,会发生Bad Things(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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.