0

这是我删除重复字符串的尝试,我有两个问题:

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;
        }
    }
}

第一:我做错了什么我没有看到?我在一本书中找到了这个例子,我相信它是有道理的。为什么重复的字符没有被删除?

第二:调用函数时,如果我这样做:

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 回答