您的位置:首页 > 编程语言 > C语言/C++

C++ 合并/去除字符串中多余的空格(创建新串)

2015-07-18 20:17 2441 查看
【申明】这是小白教程…

【注】此算法不会对句法进行检查,开头空格、结尾空格不会删去,符号周围的空格不会精简。

首先,什么是多余?我对多余的解释是——对解释器而言可合并而未合并的无意义元素重复现象。

例如:

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++ 字符串