C - K& R练习2.4 - 为什么我会收到公交车错误?

时间:2011-07-03 12:28:09

标签: c segmentation-fault bus-error

为什么我收到总线错误?有问题的行标记在代码中。

练习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 个答案:

答案 0 :(得分:2)

因为"XALOMR"是一个字符串文字(只读),你无法修改它(就像你在这里做的那样:s[j++] = s[i];

解决方法是:

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

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

这会在堆栈上创建一个字符数组。

答案 1 :(得分:1)

当您尝试更改字符串文字时,可能会出错。

真正发生的是代码的行为未定义。如果你很幸运,你就会出错。如果你运气不好,代码似乎会按预期工作,这使得很难找到错误。

顺便提一下,你可以声明一个char数组,它从用于初始化它的字符串文字中获取它的大小:

char var1[] = "XALOMR"; /* sizeof var1 == 7 */

答案 2 :(得分:0)

字符串文字是只读的。当您尝试更改它时,您会遇到错误。

答案 3 :(得分:0)

如果要修改它们,则需要创建这些变量。

char var1[20] =  "XALOMR";
squeeze(var1, "AO");