字符c1[]=";abcde“;当char*c1=";abcde“;结果是错的?

字符c1[]=";abcde“;当char*c1=";abcde“;结果是错的?,c,C,我正在进行“c编程语言”练习2.4,它删除s1中与字符串s2中任何字符匹配的每个字符。下面是我的代码,它可以工作。但是,如果我将Main函数中的定义从char c1[]=“abcde”更改为char*c1=“abcde”,则会出现分段错误(堆芯转储)。知道为什么吗 #include<stdio.h> #define UNREPEAT 1 #define REPEAT 0 void squeeze(char *s1,char *s2); void main(){ char c1[]

我正在进行“c编程语言”练习2.4,它删除s1中与字符串s2中任何字符匹配的每个字符。下面是我的代码,它可以工作。但是,如果我将Main函数中的定义从
char c1[]=“abcde”
更改为
char*c1=“abcde”
,则会出现分段错误(堆芯转储)。知道为什么吗

#include<stdio.h>
#define UNREPEAT 1
#define REPEAT 0

void squeeze(char *s1,char *s2);

void main(){
char c1[]="abcde";
char c2[]="cd";
printf("c1 is %s\n",c1);
squeeze(c1,c2);
printf("the final result is %s\n",c1);
}

void squeeze(char *s1,char *s2){
int i,j,judge;
int k=0;
for(i=0;*(s1+i)!='\0';i++){
  judge=UNREPEAT;   
   for(j=0;*(s2+j)!='\0';j++){
     if (*(s1+i)==*(s2+j)){
      judge=REPEAT;
      break;}
    }

if( judge==UNREPEAT){
  * (s1+k)=*(s1+i);
  k++;}

 }
 *(s1+k)='\0'; 
 }
#包括
#定义不重复1
#定义重复0
空隙挤压(半焦*s1,半焦*s2);
void main(){
字符c1[]=“abcde”;
字符c2[]=“cd”;
printf(“c1是%s\n”,c1);
挤压(c1,c2);
printf(“最终结果为%s\n”,c1);
}
空隙挤压(字符*s1,字符*s2){
int i,j,法官;
int k=0;
对于(i=0;*(s1+i)!='\0';i++){
法官=不重复;
对于(j=0;*(s2+j)!='\0';j++){
如果(*(s1+i)=*(s2+j)){
判断=重复;
中断;}
}
如果(判断==不重复){
*(s1+k)=*(s1+i);
k++;}
}
*(s1+k)='\0';
}
因为

char c1[] = "abcde";

声明一个数组,它是可读的和可写的,并且总是有6个字节(如果你考虑终止<代码> \ 0 '/COD>),你就不能扩展它,但是当然你可以用它来存储更少的字节。 当

是一个静态字符串文本。它不应被修改,您应该始终使用
const
限定符声明字符串文本,这样,如果您试图修改其内容,编译器会警告您,这是非法的,只需使用

const char *c1 = "abcde";
这是一个只读的字符串文本,在函数中,您试图更改它的内容,这样您可能会遇到seg错误

而另一种情况,

char c1[] = "abcde";
您正在堆栈上分配可修改其内容的内存


PS:字符串文本是只读的

数组不是指针。是的
*(s1+k)=*(s1+i)有问题。。。
char *c1="abcde"
char c1[] = "abcde";