要求:处理一个字符串,删除字符串中多余的空格、水平制表符和空行,并满足下列要求:

(1)对原字符串只能进行一次扫描。
(2)不允许申请新的空间。
(3)处理后的字符串的首尾不能有空格、制表符和空行。
(4)如果原字符串中连续出现空格和水平制表符,则处理后的字符串只需存储一个空格。
(5)如果原字符串中连续出现空格、水平制表符和空行,则处理后的字符串只需存储一个空行。

C语言实现代码如下(该代码经过garbageMan提醒后进行了更改):

 //state 0: 初始状态
//state 1: 前一个字符是'\n'(非初始状态)
//state 2: 前一个字符是空格(非初始状态)
//state 3: 前一个字符既不是空格也不是'\n'
void remove_extra_space(char *str)
{
int state = ; //当前状态
int i = ; //读入位置
int j = ; //输出位置 for(; str[i] != ; ++i)
{
if(str[i] == ' ' || str[i] == '\t')
{
if(state == || state == || state == )
continue;
else if(state == )
{
str[j++] = ' ' ;
state = ;
}
}
else if(str[i] == '\n')
{
if(state == || state == )
continue;
else if(state == )
{
str[j - ] = '\n';
state = ;
}
else if(state == )
{
str[j++] = '\n';
state = ;
}
}
else
{
str[j++] = str[i];
state = ;
}
}
if(state == || state == )
--j;
str[j] = ;
}

参照garbageMan的思路和playerc的代码更改为使用指针的版本(推荐):

 void remove_extra_space(char *str)
{
char *sp = str;
char *prev = ; while(*str && (*str == ' ' || *str == '\n' || *str =='\t'))
++str; for(; *str; ++str)
{
switch (*str)
{
case '\t': *str = ' ';
case ' ' :
if (*prev == '\n' || *prev ==' ')
continue;
break; case '\n':
if (*prev == '\n')
continue;
else if (*prev == ' ')
{
*prev = '\n';
continue;
}
break;
} prev = sp;
*sp++ = *str;
} if(prev && *prev && (*prev == ' ' || *prev == '\n'))
--sp;
*sp = ;
}

参考playerc所写代码:http://www.cnblogs.com/playerc/p/3217355.html

最后,对所有提供宝贵意见的朋友表示感谢!

删除字符串中多余的空白字符和空行(C语言实现)的更多相关文章

  1. 如何删除word中多余的空格和空行

    去除word中多余的空格及空行 一.去掉表格和格式 为了版面的整齐,网页文档都是以表格的形式存在的,只是一般情况下表格的颜色被设为无色或表格宽度被设为0,所以我们在网页上看不到表格.另外,网 页文档中 ...

  2. C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,

    //将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...

  3. C# 删除字符串中的中文

    /// <summary> /// 删除字符串中的中文 /// </summary> public static string Delete中文(string str) { s ...

  4. PAT 字符串-02 删除字符串中的子串

    /* 2 *PAT 字符串-02 删除字符串中的子串 3 *2015-08-09 4 作者:flx413 5 */ #include<stdio.h> #include<string ...

  5. JS中删除字符串中的空格

    问题描述:         在进行字符串操作时,由于字符串中存在较多的空格,因此需要考虑取消字符串中的空格 问题解决:       (1)删除字符串中的前导空格(字符串的前面的空格): 注意:这里使用 ...

  6. jst通用删除数组中重复的值和删除字符串中重复的字符

    以下内容属于个人原创,转载请注明出处,非常感谢! 删除数组中重复的值或者删除字符串重复的字符,是我们前端开发人员碰到很多这样的场景.还有求职者在被面试时也会碰到这样的问题!比如:问删除字符串重复的字符 ...

  7. 算法基础:删除字符串中出现次数最少的字符(Golang实现)

    描写叙述: 实现删除字符串中出现次数最少的字符.若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串. 字符串中其他字符保持原来的顺序. 输入: 字符串仅仅包括小写英文字母, 不考虑非法输入, ...

  8. Java-Runoob-高级教程-实例-字符串:03. Java 实例 - 删除字符串中的一个字符

    ylbtech-Java-Runoob-高级教程-实例-字符串:03. Java 实例 - 删除字符串中的一个字符 1.返回顶部 1. Java 实例 - 删除字符串中的一个字符  Java 实例 以 ...

  9. Python:删除字符串中的字符

    一.删除字符串两端的一种或多种字符 #strip().lstrip().rstrip()方法:(默认删除空格符) A.list.strip(字符):删除字符串两端的一种或多种字符: #例:删除字符串s ...

随机推荐

  1. About

    about: Thanks to NetEase company, the people contribute to NetEase online course, Stephen Prata(< ...

  2. C++ typedef与const

    1.typedef 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间:  typedef     int        INT; ...

  3. 也谈js函数节流

    1.什么是js函数节流 其本质就是不让某些代码(函数)在没有间断的情况下连续重复执行,目的就是让执行函数的请求停止了一段时间后才执行. 2.函数节流运用的场景 窗口大小的改变(resize事件),滚动 ...

  4. 初学swift笔记 函数(六)

    import Foundation /* func 函数名 (参数名:参数类型) { } func 函数名 (参数名:参数类型) ->Void{ } func 函数名 (参数名:参数类型) -& ...

  5. 4位或者5位led数码显示,485通信modbus,支持任意小数点写入,工业标准设置,可和plc,dcs,组态完美对接,支持定制修改

    MRD-5030具有4位8段数码管,支持通过工业标注协议Modbus(Modbus-RTU)控制显示,支持任意小数点的显示.数据以半双工方式通信.电源端口和通信端口都具有防浪涌,防雷600W保护,能够 ...

  6. 【Java 小实验】重写(覆写 Override)返回值类型能不能相同

    背景 每次看到重写那里写着: 重写机制是指子类的方法的方法名.参数表.返回值与父类中被重写的方法都相同,而方法体不同. 而重载是: 方法名与父类中的相同,而参数表不同,则属于同名方法的重载. 本来的感 ...

  7. xrdp的rdp前端无法连接Windows 2008的问题

    xrdp使用rdp前端,无法连接2008,但连接2003是可以的.连接2008的时候,会在客户端发送Client Info PDU后主动RST掉连接.如下图 开始以为是客户端发送Client Info ...

  8. Aix 文件名补齐及aix6.1 bash安装

    Aix历史查询快捷键=>按ESC+k 设置KSH的自动补全(仅仅是文件名补全,没有命令补全)和历史命令功能 方法一: set -o vi 历史命令功能(esc -,esc +)自动补全文件名(e ...

  9. LightOJ 1085(树状数组+离散化+DP,线段树)

    All Possible Increasing Subsequences Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format: ...

  10. 一封在JSP课程结束之后给学生的信

    <JSP应用程序设计>这门课终于考完了,虽然题目有点难,但我看大部分同学考的还可以,算上平时成绩应该都能拿到一个满意的分数. 再次感谢大家一个学期来对我的支持,跟大家一起的这个学期很开心, ...