在测试用例期间避免总线错误:10

时间:2018-03-31 18:27:52

标签: c

我试图在不使用任何其他缓冲区的情况下从字符串中删除重复的字符。当我声明一个像这个

的变量时,代码可以工作
char s[] = "aaabbb";

但不是在我尝试循环测试几个测试用例时。

#include <stdio.h>
#include <string.h>

/* Design an algorithm and write code to remove the duplicate characters in a string
without using any additional buffer. NOTE: One or two additional variables are fine.
An extra copy of the array is not. */

void removeDuplicates(char s[]) {
    // attempts to modify array in place without extra buffer
}

int main() {
    char *s[4] = {"aaaa", "abcd", "ababab", "aaabbb"};

    int i;
    for (i = 0; i < 6; i++) {
        removeDuplicates(s[i]);
    }
    return 0;
}

这会返回Bus error: 10,因为它正在尝试修改字符串文字"aaaa",但我不确定如何在保持测试用例的良好设置的同时克服这个问题。

1 个答案:

答案 0 :(得分:2)

s[i]指向字符串文字,你需要一个2维char数组:

char s[][7] = {"aaaa", "abcd", "ababab", "aaabbb"}

另请注意,对于长度为n的字符串,由于n+1&#34; aaabbb&#34;`长度为6,因此需要至少'\0'-termination.个空格,因此需要至少7个空格。

然后你可以做

int main() {
    char s[][7] = {"aaaa", "abcd", "ababab", "aaabbb"};

    size_t i;
    for (i = 0; i < sizeof s / sizeof s[0]; i++) {
        removeDuplicates(s[i]);
    }
    return 0;
}