2

SEで文字列連結の質問が死ぬまで尋ねられたことを私は知っています。しかし、私の知る限り、役に立ちそうなすべての質問に答えましたが、無駄でした。

これは、私がこのプログラムで達成したいと思っていることです:

最初は、それぞれ n=0 と n=1 に対して、a=0 と b=1 があります。

次の入力、つまり n=3 以降では、結果は前の 2 つの文字列の連結になります。(フィボナッチ数列のように、加算のみが連結に置き換えられます)

たとえば、
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;

}

私は何を間違っていますか?

4

6 に答える 6

6

strcat(b,a);b文字列リテラルを指しているため、未定義の動作が発生します。

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

文字列の連結 文字列のコピーを文字列sourceに追加しdestinationます。

これは C++ であるためstd::string、 and+演算子を使用することをお勧めします。またはstd::stringstream

于 2012-08-10T20:59:08.643 に答える
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;
于 2012-08-10T20:59:16.173 に答える
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::string、 orを使用することをお勧めしますstd::stringstream

于 2012-08-10T20:59:47.123 に答える
0

あなたは宣言ab

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

これらは定数文字列へのポインタです。これは、これらのポインタに割り当てられるメモリが固定されていることを意味します。このメモリ ブロックを超えて書き込むと、Bad Things(TM) が発生します。

于 2012-08-10T21:00:32.507 に答える
0

使用してstrcatいますが、宛先文字列は文字列リテラルです。strcat次に、ヌル文字で終わるその文字列を超えて書き込もうとしており、そこでセグ違反が発生します。文字列リテラルをまったく変更しようとしないでください。これが学習演習でない限り、C++ を使用する贅沢があるため、std::string を使用する方がはるかに優れています。

于 2012-08-10T21:02:50.133 に答える
0

代わりにこのコードを使用できます。n = 1、2 の初期値を考える必要があることを示しています。また、n < 0 で間違った入力を処理し、動的割り当てを避ける必要があります。理由があり、最後に削除してメモリを解放するのを忘れていました。

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

}

于 2012-08-10T21:10:28.533 に答える