c - C 中的段错误(核心转储),K&R 练习 2.5 的 C 编程语言

标签 c segmentation-fault

<分区>

我正在为 squeeze(s1,s2) 编写代码,删除字符串 s1 中与字符串 s2 中的任何字符匹配的每个字符,当我尝试运行该程序时出现“段错误(核心已转储)”。 我相信错误来自于我如何调用 main() 中的函数。我是初学者,我不知道如何调用函数。请帮忙!

#include<stdio.h>
void squeezer(char s[], char c[]);

main()
{
    squeezer("abcdefgabcdefgabcdefg", "abcd");
}
void squeezer(char s[], char c[])
{
    int i,j,k,z;
    for(k=0; c[k] != '\0'; k++) {
        for(i=j=0;s[i] != '\0';i++) {
            if (s[i] != c[k]) {
                s[j++] = s[i];
            }
        s[j] = '\0';
        }
    }


    for(z=0; z < j; z++)
        printf("%c",s[z]);
}

最佳答案

您正在将字符串文字传递给您的函数,然后尝试修改它。您不能修改字符串文字。修改字符串文字会调用未定义的行为。在这种情况下,您可能会得到预期或意外的结果您也可能会遇到段错误或程序崩溃。
您可以将 main 函数更改为

int main(void)
{
    char s1[] = "abcdefgabcdefgabcdefg";
    char s2[] = "abcd";
    squeezer(s1, s2);
}  

必读:comp.lang.c FAQ list · Question 1.32 .

关于c - C 中的段错误(核心转储),K&R 练习 2.5 的 C 编程语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21098921/

相关文章:

c++ - 在排序数组中找到a [i] = i的最有效方法是什么?

c - sys_readlink 失败 EFAULT - 备选方案

c++ - C++ 中的 Trie 实现

C 结构体数组的段错误

POSIX 上的 C++ 故障转储

c++ - 在 C++ 中返回二维 vector 时出现段错误

c# - 等于c#中的sprintf

c - C中的原子递减和测试

C 不将字符复制到新数组中

c++ - C++ 数组释放期间的段错误