从另一个字符串中存在的字符串中删除字符

时间:2014-06-21 20:02:41

标签: iphone c string pointers

这是从一个字符串中删除字符的代码,比如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--;

}

1 个答案:

答案 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个字符。这有助于防止溢出,而不是完全阻止它。