【问题标题】:Remove chars from one string which are present in another string从一个字符串中删除另一个字符串中存在的字符
【发布时间】:2014-06-21 20:02:40
【问题描述】:

这是从一个字符串中删除字符的代码,比如 p,它们在另一个字符串中,比如 s,最后连接两个字符串并打印最终的字符串。

例如:如果输入是

stringP=“你好” StringS=“同学”

输出:Hfellow

另一个EX

输入 stringP = "安卓" StringS="谷歌"

输出

安卓谷歌

字符的比较区分大小写。

目前我在输入第一个字符串后出现分段错误。谁能帮我纠正这个代码?以及为什么会出现分段错误,发生在哪些场景?

提前致谢。

#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--;

}

【问题讨论】:

  • char *p,*s;...scanf("%s",p);scanf("%s",s); : 没有确保存储字符串的区域。
  • remove_char(&amp;len1,p); : len1 不是p 的长度。
  • 答案只能是“C”吗?
  • 如果你愿意,你可以使用 strpbrk 来简化你的代码。

标签: iphone c string pointers


【解决方案1】:

声明 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 个字符。这将有助于防止溢出,而不是完全防止溢出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多