【发布时间】:2021-09-06 20:29:24
【问题描述】:
我已经编写了这个练习,它应该删除出现在第二个字符串中的第一个参数字符串中的所有字符。但结果是以下参数的分段错误。谁能向我解释我错过了什么?
#include <stdio.h>
void squeez(char s1[], char s2[])
{
int i, j, k, match;
while (s1[i] != '\0') {
match = 0;
for (k = 0; s2[k] != '\0'; ++k) {
if (s1[i] == s2[k]) {
match = 1;
break;
}
}
if (match) {
i++;
} else {
s1[j++] = s1[i++];
}
}
s1[j] = '\0';
}
int main()
{
char s[] = "asdsffffsffsk";
char x[] = "sf";
squeez(s, x);
printf("%s %s", s, x);
return 0;
}
【问题讨论】:
-
循环调用
strcspn()? -
i,j未初始化 -
一个好的开始是将
i初始化为0。实际上,它的值是未知的,所以谁知道您要在内存中的哪个位置建立索引?j也是如此。难怪你会遇到分段错误。 -
这似乎是学习如何使用 调试器 捕捉崩溃并在代码中定位它们发生的时间和位置的最佳时机。当您发现崩溃时,您还可以检查所有相关变量的值以确保它们正常(如数组索引在范围内)。
-
在数组中使用索引比递增
s1复杂得多。熟悉指针算法;它应该是你最好的朋友。