我只是想问一下,我的代码有什么问题,为什么说分段错误(核心转储)?我试图筛选所有类似的字母,只打印不同的字母。这是我的代码(来自我的教授的骨架代码)这里是原始指令:“删除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;
}
答案 0 :(得分:0)
因为在
s[i]++;
s
引用"banana"
(字符串文字),您正在尝试修改它。修改字符串文字具有未定义的行为,并且在许多系统上它只会崩溃,因为编译器将字符串文字放在只读内存中。
使用gcc,您可以使用-Wwrite-strings
来获取有关此类代码的警告。
答案 1 :(得分:0)
您遇到分段错误,因为字符串“banana”是文字,这意味着它是只读的。
在您的代码中,您尝试执行s [i] ++,这会增加其中一个字符的值。您不能这样做,因为它是只读的。没有它你的代码编译并运行良好。
现在回答你的问题。您指定解决方案应返回结果,而不是将其打印出来,并且由于文字是只读的,我们需要创建一个新字符串。我选择使用malloc,以便新字符串的大小与旧字符串的大小匹配,但您也可以分配固定的缓冲区。
以下代码打印“bnn”:
{{1}}