【字符串处理算法】删除特定的字符的算法设计及C代码实现

简介: 一、需求描述输入一个长字符串和一个短字符串,编写程序从长字符串中将在短字符串出现过的字符删除掉。例如,长字符串为“1234abcd”,短字符串为“3a”,那么经程序处理之后的字符串为“124bcd”;又如,长字符串为“good bye”,短字符串为“obh”,那么经程序处理之后的字符串为“gd ye”。

一、需求描述

输入一个长字符串和一个短字符串,编写程序从长字符串中将在短字符串出现过的字符删除掉。

例如,长字符串为“1234abcd”,短字符串为“3a”,那么经程序处理之后的字符串为“124bcd”;又如,长字符串为“good bye”,短字符串为“obh”,那么经程序处理之后的字符串为“gd ye”。

 

二、算法设计

我们可以通过将长字符串中的字符逐个与短字符串中的字符相比较来判断是否应该将某个字符从长字符串中删除掉。

即如果长字符串为“1234abcd”,短字符串为“2a”,那么先将长字符串中的第一个字符“1”分别与短字符串中的“2”和“a”相比较,发现都不相等,于是将字符“1”加入到新的字符串中;接着将长字符串中的第二个字符“2”分别与短字符串中的“2”和“a”相比较,发现有相等的,于是不将字符“2”加入到新的字符串中;如此循环执行,直到长字符串中的所有字符都比较完成。

 

三、特殊流程考虑

在编写程序的过程中,我们要对输入的字符串的长度及格式多做考虑,如:

1.如果输入的两个字符串之一含有中文字符,那么程序直接返回而不执行后续流程。

2.如果输入的短字符串的长度大于了长字符串的长度,那么程序直接返回而不执行后续流程。

 

四、程序代码

 

/**********************************************************************
* 版权所有 (C)2016, Zhou Zhaoxiong。
*
* 文件名称: RemoveChars.c
* 文件标识: 无
* 内容摘要: 在长字符串中删除在短字符串中出现过的字符
* 其它说明: 例如, 长字符串为"My name", 短字符串为"na", 那么结果为"My me"
* 当前版本: V1.0
* 作    者: Zhou Zhaoxiong
* 完成日期: 20160318
*
**********************************************************************/
#include 

// 重新定义数据类型
typedef signed   char  INT8;
typedef          int   INT32;
typedef unsigned int   UINT32;

// 函数声明
void RemoveCharsFromStr(INT8 *pszInputLongStr, INT8 *pszInputShortStr);


/**********************************************************************
* 功能描述: 主函数
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 0-执行成功   其它-执行失败
* 其它说明: 无
* 修改日期        版本号     修改人            修改内容
* ---------------------------------------------------------------------
* 20160318        V1.0     Zhou Zhaoxiong        创建
***********************************************************************/
INT32 main()
{
    INT8   szInputLongStr[100] = {0};
    INT8   szInputShortStr[50] = {0};
    UINT32 iPosFlag            = 0;
    
    printf("Please input the long string: \n");
    gets(szInputLongStr);
    printf("InputLongStr=%s\n", szInputLongStr);

    printf("Please input the short string: \n");
    gets(szInputShortStr);
    printf("InputShortStr=%s\n", szInputShortStr);

    // 判断两个字符串中是否有中文字符
    for (iPosFlag = 0; iPosFlag  strlen(szInputLongStr))
    {
        printf("%s is longer than %s, please check!\n", szInputShortStr, szInputLongStr);
        return -2;
    }

    // 调用函数从长字符中将在短字符串中存在的字符删除掉
    RemoveCharsFromStr(szInputLongStr, szInputShortStr);
    
    return 0;
}


/**********************************************************************
* 功能描述: 从长字符中将在短字符串中存在的字符删除掉
* 输入参数: pszInputLongStr-输入的长字符串
             pszInputShortStr-输入的短字符串
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 无
* 修改日期        版本号        修改人          修改内容
* ---------------------------------------------------------------------
* 20160318        V1.0     Zhou Zhaoxiong        创建
***********************************************************************/
void RemoveCharsFromStr(INT8 *pszInputLongStr, INT8 *pszInputShortStr)
{
    INT8   szNewtStr[100] = {0};
    UINT32 iOuterLoopFlag = 0;
    UINT32 iInnerLoopFlag = 0;
    UINT32 iCharUseFlag   = 0;

    if (pszInputLongStr == NULL || pszInputShortStr == NULL)
    {
        return;
    }

    memset(szNewtStr, 0x00, sizeof(szNewtStr));
    
    for (iOuterLoopFlag = 0; iOuterLoopFlag 

 

五、程序测试

我们将编写好的程序“RemoveChars.c”上传到Linux机器,并使用“gcc -g -o RemoveCharsRemoveChars.c”命令对该程序进行编译,生成“RemoveChars”文件。下面对程序进行详细的测试。

1.输入长字符串为“1234abcd”,短字符串为“2a”时,程序运行情况如下:

Please input the long string:

1234abcd

InputLongStr=1234abcd

Please input the short string:

2a

InputShortStr=2a

Remove chars of 2a from 1234abcd, the new str is: 134bcd

 

2.输入长字符串为“Happy dog!”,短字符串为“ao”时,程序运行情况如下:

Please input the long string:

Happy dog!

InputLongStr=Happy dog!

Please input the short string:

ao

InputShortStr=ao

Remove chars of ao from Happy dog!, the new str is: Hppy dg!

 

3.输入长字符串为“我们123”,短字符串为“345”时,程序运行情况如下:

Please input the long string:

我们123

InputLongStr=我们123

Please input the short string:

345

InputShortStr=345

我们123 has Chinese character, please check!

 

4.输入长字符串为“12345”,短字符串为“234567”时,程序运行情况如下:

Please input the long string:

12345

InputLongStr=12345

Please input the short string:

234567

InputShortStr=234567

234567 is longer than 12345, please check!

 

5.输入长字符串为“abcdsf”,短字符串为“af2”时,程序运行情况如下:

Please input the long string:

abcdsf

InputLongStr=abcdsf

Please input the short string:

af2

InputShortStr=af2

Remove chars of af2 from abcdsf, the new str is: bcds

 

六、需求扩展

基于本文中的需求和程序,我们可考虑对需求进行以下扩展:

1.如果短字符串中的某个字符在长字符串中存在,那么在长字符串的对应位置用空格占位,而不是直接将该字符从长字符串中删除。

2.不限制输入字符串中不能出现中文字符,即如果长字符串为“我们123”,短字符串为“我1”,那么经程序处理之后的字符串为“们23”。

 

目录
相关文章
|
2月前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
48 0
|
16天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
27天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
34 3
|
26天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
2月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
2月前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
2月前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
18 0
|
2月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
24 0
|
3月前
|
机器学习/深度学习 存储 算法
经典算法代码
这段代码展示了多个经典算法,包括:穷举法解决“百钱买百鸡”问题;递推法计算“猴子吃桃”问题;迭代法求解斐波那契数列及折纸高度超越珠峰的问题。同时,还提供了希尔排序算法实现及披萨票务订购系统和汉诺塔问题的链表存储解决方案。每部分通过具体案例解释了算法的应用场景与实现方法。
31 3
|
4月前
|
人工智能 算法 数据可视化
DBSCAN密度聚类算法(理论+图解+python代码)
DBSCAN密度聚类算法(理论+图解+python代码)
下一篇
无影云桌面