0

繰り返される文字の数を使用して文字列を圧縮するプログラムを作成しました。圧縮された文字列が元の文字列よりも長い場合でも、元の文字列を返します。以下は私のプログラムです:

void stringCompress(char* src) {
    char* original;
    original = src;
    char* rst;
    rst = src;

    int histogram[256];
    for (int i = 0; i < 256; i++) {
        histogram[i] = 0;
    }
    int length = 0;
    while (*src != NULL) {
        length++;
        src++;
    }
    src = original;
    int j = 0;

    for (int i = 0; i < length; i++) {

        histogram[(int) src[i]]++;
        if (histogram[(int) src[i]] == 1) {
            rst[j] = src[i];

            j++;

        }

    }
    rst[j] = '\0';

    char* final;

    rst = original;
    int index = 0;
    char buffer[33];

    for (int i = 0; i < j; i++) {

        final[index] = rst[i];

        stringstream number;
        number<<histogram[(int)rst[i]];
------->        //cout<<number.str()<<endl;
        char* temp = new char[number.str().length()+1];
        strcpy(temp, number.str().c_str());
        index++;
        cout<<temp<<endl;
        for(int k =0 ;k<number.str().length();k++)
        {
            final[index]=temp[k];
            index++;

        }

    }

    final[index] = '\0';
    src = original;

    if (index <= length) {
        for (int i = 0; i < index; i++)

            cout<<final[i];
    } else {
        cout << src << endl;
    }

}

しかし、奇妙なことに、cout文をcout<<number.str()<<endl;そこに残すと(矢印は文を指します)、出力は正しくなります。たとえば、aaaabcdaaはa6b1c1d1を出力し、aabcdはaabcdを出力します。ただし、コメントアウトするcout<<number.str()<<endl;と、何も生成されません。どんな助けでも大歓迎です。

4

1 に答える 1

2

変数finalはコードで初期化されていません。メモリバッファで初期化すると、ポイントした行がコメントアウトされているかどうかに関係なく、プログラムは目的の出力を出力します。

おそらく、次のように、 buffer(未使用の)メモリとして使用することを意図してfinalいました。

final = buffer;
于 2012-07-15T20:01:25.490 に答える