代码改变世界

从第一字符串中删除第二个字符串中所有的字符

  youxin  阅读(2796)  评论(0编辑  收藏  举报

题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。

      例如,输入”They are students.””aeiou”,则删除之后的字符串变成”Thy r stdnts.”

分析:题目可分解为如何判断一个字符串中包含特定字符以及

      如何在一个字符串中删除特定字。

 

判断一个字符串是否包含是定字符,可首先创建一个字符串的Hash表,把字符串中对应的字符对代表的hash元素置为1. 字符参数所代表Hash元素值是为1就表示字符存在。

 (这种“字符串hash”的思想要掌握,可以快速在一些字符中查找某个字符)

在一个字符串中删除指定字符,比较好的方法是通过快慢消除法。

 

具体实现如下:

复制代码
#include <stdio.h>

#define Boolean int

#define TRUE 1

#define FALSE 0

 

int charHash[256] = {0};

void createCharHash(const char *s)

{

      while(*s)

      {

            charHash[*s++] = 1; //这里默认会进行integral promotion整形提升,所以不需要显示(int)转化

      }

}

 

Boolean isContain(char c)

{

      if(charHash[c])

      {

            return TRUE;

      }else{

            return FALSE;

      }

 

}

 

void delChars(char *str, const char *s)//str是要操作的字符,s是删除字符串

{

      int i = 0;

      int j = 0;

      createCharHash(s);

      while(str[i])

      {

            if(!isContain(str[i]))

            {

                  str[j++] = str[i];

            }

            i++;

      }

      str[j] = '\0';

}

int main(void)

{
      char xie[] = "They are students.";

      delChars(xie, "aeiou");

      printf("result is %s\n",xie);

      return 0;

}
复制代码

当我在写上面的程序时,代码如下;

复制代码
char * delChars(char *s,const char* s2)
{
     createTable(s2);

     char *source=s;
    int j=0;
    while(*s)
    {
        if(hashTable[*s]==0)
        {
             s[j++]=*s;
            
        }
        s++;
    }
    s[j]='\0';
}
复制代码

总是运行错误,debug了好久,终于找出错在哪里了。

s[j++]=*s;

这里错误,我们的j是相对于原来的起点的,这里s已经移动了,不是原来的起点。改正:

复制代码
void delChars(char *s,const char* s2)
{
     createTable(s2);

     char *source=s;
    int j=0;
    while(*s)
    {
        if(hashTable[*s]==0)
        {
            //s[j++]=*s 错误
            source[j++]=*s;
        }
        s++;
    }
    source[j]='\0';

     
}
复制代码

 

 

转自;http://blog.163.com/xie_wenbin613/blog/static/17548909520125133138852/

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2012-09-01 MySQL数据库在指定位置增加字段
2012-09-01 php插入日期到mysql失败
2012-09-01 mysql 配置和php&mysql乱码问题
2012-09-01 css 文字换行
2012-09-01 CSS Triangle Arrow DIVs tooltilps
2012-09-01 bulletproof ajax 05: hijax
2012-09-01 bulletproof ajax:ajax 载入时显示动画
点击右上角即可分享
微信分享提示