C - K & R упражнение 2.4 - почему я получаю ошибку в автобусе? - PullRequest
1 голос
/ 03 июля 2011

Почему я получаю ошибку шины?Проблемная строка отмечена внутри кода.

Упражнение 2-4.Напишите альтернативную версию squeeze (s1, s2), которая удаляет каждый символ в 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 ]

2 голосов
/ 03 июля 2011

Поскольку "XALOMR" является строковым литералом (который доступен только для чтения), и вы не можете изменить его (как здесь: s[j++] = s[i];)

Способ обойти это:

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

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

Что создаст массив символов в стеке.

1 голос
/ 04 июля 2011

Когда вы пытаетесь изменить строковый литерал, вы можете получить ошибку.

Что действительно происходит, так это то, что поведение вашего кода не определено.Если вам повезет, вы получите ошибку.Если вам не повезло, код будет работать должным образом, что затрудняет поиск ошибки.

Кстати, вы можете объявить массив char, размер которого будет получен из строкового литерала, использованного для его инициализации:

char var1[] = "XALOMR"; /* sizeof var1 == 7 */
0 голосов
/ 03 июля 2011

Вам нужно сделать эти переменные, если вы хотите изменить их.

char var1[20] =  "XALOMR";
squeeze(var1, "AO");
0 голосов
/ 03 июля 2011

Строковые литералы доступны только для чтения.Когда вы пытаетесь изменить его, вы получаете ошибку.

...