1

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

练习 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

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

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

于 2011-07-03T12:31:25.130 回答
0

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

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