在C++中以迭代方式连接两个字符串
Concatenating two strings iteratively in C++
我知道在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::string
或std::stringstream
.
您已将a
和b
声明为
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;
}
- 两个字符串在 c++ 中不相等
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 比较两个字符串后卡在无限循环中
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 使用XOR查找O(n)-解决方案中的两个字符串是否为变位符
- 如何将两个字符串加在一起,就好像它们是变量一样?
- 我需要帮助在一个类中输入两个字符串并获取其输出
- 两个字符串之间的数学运算
- sscanf() 有两个字符串参数
- 我的字符串数组一次打印出前两个字符串
- 两个 c++ 字符串上的异或
- 函数返回两个字符串的第一个常用字符
- 目标是找到两个 c 字符串之间的公共前缀(必须使用特定的函数标头)
- 我需要在C++的两个字符串之间找到共同的前缀
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 给定两个字符串 S 和 T.确定与 T 相差最小的 S 子字符串?
- gtest:检查字符串是否等于两个字符串之一
- 交换两个字符串时访问正确的内存时,我遇到了分段错误
- 我可以在系统()中使用两个字符串吗?