删除字符串中多余的空白字符和空行(C语言实现)
要求:处理一个字符串,删除字符串中多余的空格、水平制表符和空行,并满足下列要求:
(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语言实现)的更多相关文章
- 如何删除word中多余的空格和空行
去除word中多余的空格及空行 一.去掉表格和格式 为了版面的整齐,网页文档都是以表格的形式存在的,只是一般情况下表格的颜色被设为无色或表格宽度被设为0,所以我们在网页上看不到表格.另外,网 页文档中 ...
- C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,
//将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...
- C# 删除字符串中的中文
/// <summary> /// 删除字符串中的中文 /// </summary> public static string Delete中文(string str) { s ...
- PAT 字符串-02 删除字符串中的子串
/* 2 *PAT 字符串-02 删除字符串中的子串 3 *2015-08-09 4 作者:flx413 5 */ #include<stdio.h> #include<string ...
- JS中删除字符串中的空格
问题描述: 在进行字符串操作时,由于字符串中存在较多的空格,因此需要考虑取消字符串中的空格 问题解决: (1)删除字符串中的前导空格(字符串的前面的空格): 注意:这里使用 ...
- jst通用删除数组中重复的值和删除字符串中重复的字符
以下内容属于个人原创,转载请注明出处,非常感谢! 删除数组中重复的值或者删除字符串重复的字符,是我们前端开发人员碰到很多这样的场景.还有求职者在被面试时也会碰到这样的问题!比如:问删除字符串重复的字符 ...
- 算法基础:删除字符串中出现次数最少的字符(Golang实现)
描写叙述: 实现删除字符串中出现次数最少的字符.若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串. 字符串中其他字符保持原来的顺序. 输入: 字符串仅仅包括小写英文字母, 不考虑非法输入, ...
- Java-Runoob-高级教程-实例-字符串:03. Java 实例 - 删除字符串中的一个字符
ylbtech-Java-Runoob-高级教程-实例-字符串:03. Java 实例 - 删除字符串中的一个字符 1.返回顶部 1. Java 实例 - 删除字符串中的一个字符 Java 实例 以 ...
- Python:删除字符串中的字符
一.删除字符串两端的一种或多种字符 #strip().lstrip().rstrip()方法:(默认删除空格符) A.list.strip(字符):删除字符串两端的一种或多种字符: #例:删除字符串s ...
随机推荐
- struts2.3.15.3中动态方法调用默认是关闭的
初学ssh,用的struts2.3.15.3,使用了如下表单: <form action="/spring3/index/login.action" method=" ...
- Oracle Dataguard三种保护模式概述(转)
Oracle的DataGuard技术有三种实现模式,分别是max performance.max availability.max protection这三种模式. 以下是来自Oracle文档的摘要信 ...
- 蜗牛爱课 - iOS7、8模态半透明弹出框
//源Controller中跳转方法实现 MKDialogController *controller = [[MKDialogController alloc] init]; controller. ...
- FileUpload控件
FileUpload控件 属性:FileName: 获取上传的文件名 HasFile: 是否选择(存在)上传的文件 ContentLength: 获得上窜文件的大小,单位是字节(byte) 方法:Se ...
- perl install module && normal module
Windows: perl -MCPAN -e shell install XML::GDOME Archive::Zip 后面继续更新... Archive usage: $obj = Arc ...
- js中typeof与instanceof的不同用法
typeof用以获取一个变量或者表达式的类型,typeof一般只能返回如下几个结果: number,boolean,string,function(函数),object(NULL,数组,对象),und ...
- Python简明教程---学习笔记
字符双引号括起,数字不括: 分隔符为逗号(,),不能为空格 变量定义时即赋值 采用utf-8编码:#-*-coding:utf-8-*-或者#coding:utf-8 字符串定义:单/双引号括起 %符 ...
- In Depth : Android Boot Sequence / Process
In Depth : Android Boot Sequence / Process What happened when I press power on button in my Android ...
- Java值创建线程的两种方式对比
在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口.那么这两种方式孰优孰劣呢? 采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...
- Epipe
http://www.cnblogs.com/carekee/articles/2904603.html http://blog.chinaunix.net/uid-10716167-id-30805 ...