为什么我收到总线错误?有问题的行标记在代码中。
练习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");
}
答案 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");