C++ 合并/去除字符串中多余的空格(创建新串)
2015-07-18 20:17
2441 查看
【申明】这是小白教程…
【注】此算法不会对句法进行检查,开头空格、结尾空格不会删去,符号周围的空格不会精简。
首先,什么是多余?我对多余的解释是——对解释器而言可合并而未合并的无意义元素重复现象。
例如:
很明显,这里多了很多无意义的空格。对解释器(这里是人的大脑)来说,多余的空格无意义,我们只需一个空格就知道这是两个单词而不是一个单词。但对文本解释器来说,就没这么”智能“了。我们需要为其编写一个合并/去除字符串中多余的空格的函数。
我们先不设计函数,我们先实现这个功能,先把我们的想法,或者说算法用具体的例子、操作来实现。
【注】C++中,我并不是很赞同用C-style风格字符串,所以这里的例子都是采用std::string。而对于C++小白来说,比较少用到直接修改原串,故这里的例子都是创建新串。
我们希望去除多余的空格后句子是这样的
通过比较,我们跳过第一、二、三个字符,直接从第四个字符(整个句子第一个空格)开始看起。
从第四个字符开始,以后两个个字符(不包括第四个)都是一样的空格。这说明了算法把三个重复空格合并为一个空格。一直往右移动目光,我们可以发现能合并的空格最少两个。
从遍历字符串的这个特点说明了函数体内必须有一个循环,循环体是字符重复判断,而循环条件是未到字符串尾。
现在重点是字符重复判断。到底是判断三个元素重复还是四个还是五个?都错,答案是两个!一个空格不叫重复,两个空格、三个空格、四个空格……叫做重复。也就是说,两个空格是重复的判断条件的基础。
图解(这里以#符号代替空格):
引索:0 1 2
元素:# # #
这个算法很好理解,就不再多啰嗦了。
放入main中
运行结果是正确的,我就不贴图了。
main中的算法流程已经写好了,然后我们将其改为函数,返回值使用string,参数列表的话就有传入字符串就可以了,传入类型使用const string&(我们先不讨论左值右值的问题,也不考虑性能效率的问题)。
代码如下:
至此,文章就结束了。
【注】此算法不会对句法进行检查,开头空格、结尾空格不会删去,符号周围的空格不会精简。
首先,什么是多余?我对多余的解释是——对解释器而言可合并而未合并的无意义元素重复现象。
例如:
GCC was originally written as the compiler for the GNU operating system.
很明显,这里多了很多无意义的空格。对解释器(这里是人的大脑)来说,多余的空格无意义,我们只需一个空格就知道这是两个单词而不是一个单词。但对文本解释器来说,就没这么”智能“了。我们需要为其编写一个合并/去除字符串中多余的空格的函数。
我们先不设计函数,我们先实现这个功能,先把我们的想法,或者说算法用具体的例子、操作来实现。
【注】C++中,我并不是很赞同用C-style风格字符串,所以这里的例子都是采用std::string。而对于C++小白来说,比较少用到直接修改原串,故这里的例子都是创建新串。
我们希望去除多余的空格后句子是这样的
GCC was originally written as the compiler for the GNU operating system.
通过比较,我们跳过第一、二、三个字符,直接从第四个字符(整个句子第一个空格)开始看起。
从第四个字符开始,以后两个个字符(不包括第四个)都是一样的空格。这说明了算法把三个重复空格合并为一个空格。一直往右移动目光,我们可以发现能合并的空格最少两个。
从遍历字符串的这个特点说明了函数体内必须有一个循环,循环体是字符重复判断,而循环条件是未到字符串尾。
现在重点是字符重复判断。到底是判断三个元素重复还是四个还是五个?都错,答案是两个!一个空格不叫重复,两个空格、三个空格、四个空格……叫做重复。也就是说,两个空格是重复的判断条件的基础。
图解(这里以#符号代替空格):
引索:0 1 2
元素:# # #
if(test[i] != '#' ) result.append(1,test[i]); else if(test[i+1] != '#') result.append(1,test[i]);
这个算法很好理解,就不再多啰嗦了。
放入main中
#include <iostream> #include <string> using namespace std; int main() { string test = "GCC was originally written as the compiler for the GNU operating system."; string result = ""; for(int i = 0;test[i] != '\0';i++) { if(test[i] != ' ' ) result.append(1,test[i]); else if(test[i+1] != ' ') result.append(1,test[i]); } cout << result; }
运行结果是正确的,我就不贴图了。
main中的算法流程已经写好了,然后我们将其改为函数,返回值使用string,参数列表的话就有传入字符串就可以了,传入类型使用const string&(我们先不讨论左值右值的问题,也不考虑性能效率的问题)。
代码如下:
#include <string> using std::string; string remove_surplus_spaces(const string& src) { string result = ""; for(int i = 0;src[i] != '\0';i++) { if(src[i] != ' ' ) result.append(1,src[i]); else if(src[i+1] != ' ') result.append(1,src[i]); } return result; }
至此,文章就结束了。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- 数据库链接字符串查询网站
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Flex字符串比较 还有Flex字符串操作
- Ruby中创建字符串的一些技巧小结
- ASP下经常用的字符串等函数参考资料
- 将字符串小写转大写并延时输出的批处理代码
- 将字符串转换成System.Drawing.Color类型的方法
- Lua中调用C++函数示例
- Lua源码中字符串类型的实现
- Lua性能优化技巧(四):关于字符串
- Lua教程(一):在C++中嵌入Lua脚本
- 字符串聚合函数(去除重复值)
- Lua教程(二):C++和Lua相互传递数据示例
- 总结的5个C#字符串操作方法分享
- sqlserver中求字符串中汉字的个数的sql语句
- sql server字符串非空判断实现方法
- VBS的字符串及日期操作相关函数