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

Posted 周兆熊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串处理算法删除特定的字符的算法设计及C代码实现相关的知识,希望对你有一定的参考价值。

一、需求描述

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

例如,长字符串为“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); iPosFlag ++)
    {
        if (szInputLongStr[iPosFlag] < 0)     // 小于0则表示含有中文字符
        {
            printf("%s has Chinese character, please check!\\n", szInputLongStr);
            return -1;
        }
    }

    for (iPosFlag = 0; iPosFlag < strlen(szInputShortStr); iPosFlag ++)
    {
        if (szInputShortStr[iPosFlag] < 0)     // 小于0则表示含有中文字符
        {
            printf("%s has Chinese character, please check!\\n", szInputShortStr);
            return -1;
        }
    }

    // 判断短字符串的长度是否超过了长字符串
    if (strlen(szInputShortStr) > 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 < strlen(pszInputLongStr); iOuterLoopFlag ++)
    {
        iCharUseFlag = 1;
        for (iInnerLoopFlag = 0; iInnerLoopFlag < strlen(pszInputShortStr); iInnerLoopFlag ++)
        {
            if (pszInputLongStr[iOuterLoopFlag] == pszInputShortStr[iInnerLoopFlag])
            {
                iCharUseFlag = 0;    // 不要将该字符加入新的字符串中
                break;
            }
        }
    
        if (iCharUseFlag == 1)
        {
            strncat(szNewtStr, pszInputLongStr+iOuterLoopFlag, 1);
        }
    }
    
    printf("Remove chars of %s from %s, the new str is: %s\\n", pszInputShortStr, pszInputLongStr, szNewtStr);
}

   

以上是关于字符串处理算法删除特定的字符的算法设计及C代码实现的主要内容,如果未能解决你的问题,请参考以下文章

字符串处理算法回文判断的算法设计及C代码实现

字符串处理算法字符串包含的算法设计及C代码实现

字符串处理算法将输入字符串中的各个单词反序的算法设计及C代码实现

字符串处理算法字符串包含的算法设计及C代码实现

字符串处理算法最长连续字符及其出现次数的算法设计及C代码实现

字符串处理算法字符串包括的算法设计及C代码实现