使用指针删除单词上的类似字母

时间:2018-05-27 17:39:49

标签: c pointers

我只是想问一下,我的代码有什么问题,为什么说分段错误(核心转储)?我试图筛选所有类似的字母,只打印不同的字母。这是我的代码(来自我的教授的骨架代码)这里是原始指令:“删除s中所有出现的c并返回结果。”

#include <stdio.h>

char* clean(char* s,int c);

int main()
{
   clean("banana",'x');
   return 0;
}

char* clean(char* s,int c)
{
   for(int i = 0; i < 6; i++)
   {
     if(s[i] != c)
      {
        printf("c",s);
        s[i]++;
      }
   }
  return s;
}

2 个答案:

答案 0 :(得分:0)

因为在

s[i]++;

s引用"banana"(字符串文字),您正在尝试修改它。修改字符串文字具有未定义的行为,并且在许多系统上它只会崩溃,因为编译器将字符串文字放在只读内存中。

使用gcc,您可以使用-Wwrite-strings来获取有关此类代码的警告。

答案 1 :(得分:0)

分段错误

您遇到分段错误,因为字符串“banana”是文字,这意味着它是只读的。

在您的代码中,您尝试执行s [i] ++,这会增加其中一个字符的值。您不能这样做,因为它是只读的。没有它你的代码编译并运行良好。

解决方案

现在回答你的问题。您指定解决方案应返回结果,而不是将其打印出来,并且由于文字是只读的,我们需要创建一个新字符串。我选择使用malloc,以便新字符串的大小与旧字符串的大小匹配,但您也可以分配固定的缓冲区。

以下代码打印“bnn”:

{{1}}