这是从一个字符串中删除字符的代码,比如p,它们在另一个字符串中,比如s,最后连接两个字符串并打印最终的字符串。
例如:如果输入是
stringP ="你好" StringS ="家伙"
输出:Hfellow
另一个EX
输入 stringP =" Android" StringS =" Google"
输出
AndridGoogle
字符的比较区分大小写。
目前我输入第一个字符串后出现分段错误。任何人都可以帮我纠正这段代码吗?以及发生分段故障的原因,在哪种情况下会发生?
提前致谢。
#include <stdio.h>
#include<string.h>
void remove_char(int *len, char *string1);
int main()
{
char *p,*s,*t;
int len1,len2,i,j;
printf("enter the two strings\n");
scanf("%s",p);
scanf("%s",s);
len1=strlen(p);
len2=strlen(s);
for(i=0;i<len1;i++)
{
for(j=0;j<len2;j++)
{
if(*p==*(s+j))
{
remove_char(&len1,p);
}
if(*p=='\0'||*(s+j)=='\0')
{
break;
}
}
p++;
}
strcat(p,s);
strcat(t,p);
printf("%s",t);
return 0;
}
void remove_char(int *len, char* string1)
{
int a;
for(a=0;a<*len;a++)
{
*string1=*(string1+1);
string1++;
}
len--;
}
答案 0 :(得分:0)
声明char* p
表示p是一个包含字符地址的变量(或者可能是字符数组的地址)。
在您的代码中,您确实为字符(或数组)创建存储空间。想一想,p
是本地堆栈框架中的位置的别名(比如一个四字节区域),它的内容被解释为堆中的地址。
现在,你的代码中没有实际分配内存的地方,为此你需要做这样的事情:
p = malloc(15*sizeof(char));
这假设您希望用户输入不超过14个字符的字符串(不要忘记空终止符)。现在p
包含堆上可用于存储字符的区域的地址。
所以,为了回答你的问题,你输入第一个字符串后就会出现分段错误,因为你没有分配内存来存储字符串。
另外,请注意scanf
是不安全的,因为只要用户感觉要输入就会占用一个字符串,这可能会导致基于堆的缓冲区溢出。如果你想读一个最多14个字符的字符串,试试这个;
#define STR_LEN 14
char* p = malloc(STR_LEN*sizeof(char));
scanf("%STR_LENs", p);
请注意,我在说明符中放了一个长度,以便scanf将自己限制为最多读取STR_LEN
个字符。这有助于防止溢出,而不是完全阻止它。