【问题标题】:Concatenating two strings iteratively in C++在 C++ 中迭代地连接两个字符串
【发布时间】:2012-08-10 20:56:10
【问题描述】:

我知道一个字符串连接问题在 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;

}

我做错了什么?

【问题讨论】:

  • 我想你忘了用 c :)
  • 我确实打算使用'c',但我发现它是一个不必要的变量:) 只是忘了我已经声明了它。

标签: c++ string-concatenation


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,我现在明白了 :) 任务完成了 :D 谢谢。
  • +1 推荐std::string/std::stringstream,你永远说不完。
【解决方案2】:

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

为避免此问题,您应该改用 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;

【讨论】:

    【解决方案3】:
    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

    【讨论】:

      【解决方案4】:

      您已将ab 声明为

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

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

      【讨论】:

        【解决方案5】:

        您正在使用strcat,但您的目标字符串是字符串文字。 strcat 然后试图写过去以空字符结尾的字符串,这就是 seg 错误出现的地方。根本不要尝试修改字符串文字。既然你有使用 C++ 的奢侈,除非这是一个学习练习,你最好使用 std::string。

        【讨论】:

          【解决方案6】:

          您可以改用此代码,我向您展示您需要考虑 n = 1, 2 的初始值 你也应该处理 n

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

          }

          【讨论】:

          • 我最初尝试过这种方法,虽然它很简单,但随着 n 值的增加,它不适用于较大的字符串
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-26
          • 2012-01-17
          • 1970-01-01
          • 1970-01-01
          • 2020-03-28
          • 2013-08-30
          相关资源
          最近更新 更多