合并字符串中连续的多个空格的C代码实现

简介: 1.问题描述 将某一字符串中连续出现的多个空格合并为一个空格,如果合并之后的字符串的首尾有空格,则将其去掉。

1.问题描述
将某一字符串中连续出现的多个空格合并为一个空格,如果合并之后的字符串的首尾有空格,则将其去掉。
例如,“ This is a string! ”是一个包含多个空格的字符串,要求其变成“This is a string!”的形式。

2.C代码实现

/**********************************************************************
* 版权所有 (C)2015, Zhou Zhaoxiong。
*
* 文件名称:CombineSpace.c
* 文件标识:无
* 内容摘要:多空格合并
* 其它说明:无
* 当前版本:V1.0
* 作   者:Zhou Zhaoxiong
* 完成日期:20150331
*
**********************************************************************/
#include <stdio.h>
#include <string.h>


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

// 函数声明
void CombineSpace(UINT8 *pszOldStr, UINT8 *pszNewStr);
INT32 main();

/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期       版本号        修改人           修改内容
* -------------------------------------------------------------------
* 20150331       V1.0     Zhou Zhaoxiong       创建
***********************************************************************/
INT32 main()
{
       UINT8 szOldStr[100] = {0};
       UINT8 szNewStr[100] = {0};

       // 第一次处理
       memcpy(szOldStr, " Hello,   everyone! ", sizeof(szOldStr)-1);
       CombineSpace(szOldStr, szNewStr);
       printf("The first case: OldStr=%s, NewStr=%s.\n", szOldStr, szNewStr);

       // 第二次处理
       memset(szOldStr, 0x00, sizeof(szOldStr));
       memset(szNewStr, 0x00, sizeof(szNewStr));
       memcpy(szOldStr, " My name   is   ZhouZhaoxiong! ", sizeof(szOldStr)-1);
       CombineSpace(szOldStr, szNewStr);
       printf("The second case: OldStr=%s, NewStr=%s.\n", szOldStr, szNewStr);

       return 0;
}


/**********************************************************************
* 功能描述:合并多个连续空格为一个, 并去掉首位的空格
* 输入参数:pszOldStr-合并空格之前的字符串
* 输出参数:pszNewStr-合并空格之后的字符串
* 返 回 值:无
* 其它说明:无
* 修改日期       版本号        修改人          修改内容
* -------------------------------------------------------------------
* 20150331       V1.0    Zhou Zhaoxiong       创建
***********************************************************************/
void CombineSpace(UINT8 *pszOldStr, UINT8 *pszNewStr)
{
    UINT32 iOldIndex        = 0;
    UINT32 iNewIndex        = 0;
    UINT8  chSingleChar     = '\0';
    UINT8  iIsSpace         = 0;
    UINT8  szTmpNewStr[100] = {0};

    if ((NULL == pszOldStr) || (NULL == pszNewStr))
    {
        printf("CombineSpace: input parameter(s) is NULL!");
        return;
    }

    while ('\0' != (chSingleChar = pszOldStr[iOldIndex++]))
    {
        if (chSingleChar == ' ')   // 多个连续空格只保留一个
        {
            if (iIsSpace == 0)
            {
                iIsSpace = 1;
                szTmpNewStr[iNewIndex++] = chSingleChar;
            }
        }
        else
        {
            iIsSpace = 0;
            szTmpNewStr[iNewIndex++] = chSingleChar;
        }
    }

    // 如果最后一个字符是空格, 则将其去掉
    if (szTmpNewStr[strlen(szTmpNewStr)-1] == ' ')
    {
        szTmpNewStr[strlen(szTmpNewStr)-1] = '\0';
    }

    // 如果第一个字符是空格, 则将其去掉
    if (szTmpNewStr[0] == ' ')
    {
        memcpy(pszNewStr, szTmpNewStr+1, strlen(szTmpNewStr)-1);
    }
    else
    {
        memcpy(pszNewStr, szTmpNewStr, strlen(szTmpNewStr));
    }

    return;
}

3.程序运行结果
在Linux下执行“gcc -g -o CombineSpace CombineSpace.c”之后,再执行“CombineSpace”命令,其结果如下:

The first case: OldStr= Hello,   everyone! , NewStr=Hello, everyone!.
The second case: OldStr= My name   is   ZhouZhaoxiong! , NewStr=My name is ZhouZhaoxiong!.

本人微信公众号:zhouzxi,请扫描以下二维码:
这里写图片描述

目录
相关文章
|
6月前
|
C语言
【Leetcode-1638.统计只差一个字符的字串数目(C语言)】
【Leetcode-1638.统计只差一个字符的字串数目(C语言)】
20 0
|
12天前
|
算法
算法系列--动态规划--⼦数组、⼦串系列(数组中连续的⼀段)(1)(上)
算法系列--动态规划--⼦数组、⼦串系列(数组中连续的⼀段)(1)
21 0
|
12天前
|
存储 算法
算法系列--动态规划--⼦数组、⼦串系列(数组中连续的⼀段)(1)(下)
算法系列--动态规划--⼦数组、⼦串系列(数组中连续的⼀段)(1)
16 0
|
1月前
字符串,每个里面包含0-N个数字,如3,8,2,编写函数,将两个这样的字符串合并,并且输出的字符串里面没有重复的数字,并从大到小排列.
字符串,每个里面包含0-N个数字,如3,8,2,编写函数,将两个这样的字符串合并,并且输出的字符串里面没有重复的数字,并从大到小排列.
21 0
|
6月前
题目:下列给定程序中函数fun的功能是:从p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。
题目:下列给定程序中函数fun的功能是:从p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。
|
测试技术
字符串中有多少个不重复的字符并按由前到后的顺序输出一个新的字符串和该字符串长度的整数
字符串中有多少个不重复的字符并按由前到后的顺序输出一个新的字符串和该字符串长度的整数
56 0
|
算法
【Day30】LeetCode算法 [769. 最多能完成排序的块 ] [2131. 连接两字母单词得到的最长回文串]
学习LeetCode算法 [769. 最多能完成排序的块 ] [2131. 连接两字母单词得到的最长回文串]。
91 0
【Day30】LeetCode算法 [769. 最多能完成排序的块 ] [2131. 连接两字母单词得到的最长回文串]
去掉多余的空格---输入一个字符串,字符串中可能包含多个连续的空格,请将多余的空格去掉,只留下一个空格。输入格式
输入一个字符串,字符串中可能包含多个连续的空格,请将多余的空格去掉,只留下一个空格。 输入格式 共一行,包含一个字符串。 输出格式 输出去掉多余空格后的字符串,占一行。 数据范围 输入字符串的长度不超过 200200。 保证输入字符串的开头和结尾没有空格。
251 0
|
算法 测试技术 索引
双指针的妙用 - 字符串中连续最多的字符和连续次数
双指针的妙用 - 字符串中连续最多的字符和连续次数
117 0
将若干字符串按字母顺序(由小到大)输出(用指针)
将若干字符串按字母顺序(由小到大)输出(用指针)
330 0