0

これは、文字列の重複を削除しようとする試みであり、2 つの質問があります。

void removeDuplicates(char *original_string)
{
    if(original_string == NULL) {
        return;
    }
    int len = strlen(original_string);
    if (len < 2) {
        return;
    }

    int tail = 1;
    int i;
    for (i = 1; i < len; i++) {
        int j;
        for (j=0; j < tail; j++) {
            if (original_string[i] == original_string[j]) {
                break;
            }
        }
        if (j == tail) {
            original_string[tail] = original_string[i];
            ++tail;
        }
    }
}

最初: 表示されないのに何が間違っているのでしょうか? 私はこの例を本で見つけましたが、それは理にかなっていると思います。重複した文字が削除されないのはなぜですか?

2番目:関数を呼び出すとき、次のようにすると:

char duplicated[] = "aba";
removeDuplicates(duplicated);

エラーは発生しません。しかし、私がそれを行うと:

char *duplicated = "aba";
removeDuplicates(duplicated);

Bus error: 10は実行時間を取得します。

4

4 に答える 4

4
char duplicated[] = "aba";

書き込み可能な s の配列を作成します。char

char *duplicated = "aba";

文字列リテラル (変更不可) を作成し、その文字列リテラルへのポインターに変数duplicatedが割り当てられます。関数はその場で文字列を変更しようとするため、文字列リテラルに書き込もうとすると未定義の動作が呼び出され、クラッシュが発生します。

于 2013-01-23T19:15:45.280 に答える
1

"..."文字列を保持するメモリの一定のチャンクを作成します。
変更することはできません。

したがって、定数文字列で呼び出された場合、変更original_string[tail]は未定義の動作です。

于 2013-01-23T19:14:30.667 に答える
1

文字列リテラルは C では変更できません。これは未定義の動作です。

したがって、duplicatedローカル配列である必要があります。

またはそうでなければならない

char duplicated[] = "aba";

そしてそうではない

char *duplicated = "aba";
于 2013-01-23T19:24:45.847 に答える
0

何も削除されていません

original_string[tail] = original_string[i]

それは何も削除していません、それは置き換えています

于 2013-01-25T14:23:51.883 に答える