字符c1[]=";abcde“;当char*c1=";abcde“;结果是错的?
我正在进行“c编程语言”练习2.4,它删除s1中与字符串s2中任何字符匹配的每个字符。下面是我的代码,它可以工作。但是,如果我将Main函数中的定义从字符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[]
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";