1

バス エラーが発生するのはなぜですか? 問題のある行はコード内にマークされています。

演習 2-4. 文字列 s2 の任意の文字に一致する s1 の各文字を削除する、squeeze(s1,s2) の代替バージョンを作成します。

    #include <stdio.h>

    /*
     * Detects if a char is inside a string
     */
    char in_string(char c, char s[]) {
        int i = 0;
        while (s[i] != '\0') {
            if (s[i++] == c)
                return 1;
        }
        return 0;
    }

    /*
     * Returns the string s without any chars that are in map
     */
    void squeeze(char s[], char map[]) {
        int i, j;

        for (i = j = 0; s[i] != '\0'; i++) {
            if (! in_string(s[i], map)) {
                s[j++] = s[i]; // <--- Bus Error
            }
        }
        s[j] = '\0';

        printf("%s\n", s);
    }

    main() {
        squeeze("XALOMR", "AO");
        squeeze("EWRTOG", "RGV");
    }
4

4 に答える 4

2

は文字列リテラル (読み取り専用) であり、変更すること"XALOMR"はできません (ここで行うように: s[j++] = s[i];)

それを回避する方法は次のとおりです。

main() {
    char s1[] = "XALOMR";
    char s2[] = "EWRTOG";

    squeeze(s1, "AO");
    squeeze(s2, "RGV");
}

スタック上に文字の配列を作成します。

于 2011-07-03T12:30:50.773 に答える
1

文字列リテラルを変更しようとすると、エラーが発生する場合があります。

実際に起こることは、コードの動作が定義されていないということです。運が良ければ、障害が発生します。運が悪ければ、コードは期待どおりに動作しているように見え、エラーを見つけるのが難しくなります。

ちなみに、初期化に使用された文字列リテラルからサイズを取得する char 配列を宣言できます。

char var1[] = "XALOMR"; /* sizeof var1 == 7 */
于 2011-07-03T21:03:09.870 に答える
0

これらの変数を変更する場合は、これらの変数を作成する必要があります。

char var1[20] =  "XALOMR";
squeeze(var1, "AO");
于 2011-07-03T12:35:41.647 に答える
0

文字列リテラルは読み取り専用です。変更しようとすると、エラーが発生します。

于 2011-07-03T12:31:25.130 に答える