c的字符串可以看成是一个以'\0'结尾的字符数组, 字符串的名字其实就是指向这个数组的首地址。 几乎所有的字串操作函数都是通过指针和'\0'结尾来处理c字符串的。 这样做的好处就是效率非常高,自由度非常高; 坏处就是安全性问题了,还有就是给人一种冲动,什么处理都想自己动手实现, 这样往往给我们的代码留下很多的隐患。
c++给我提供了一个string的类型,其实他的内部实现是basic_char模板类, 用c++处理字符串string给我们提供了很多的接口,几乎可以是实现字符串处理的全部要求。 对于我这样原来一直都使用C语言且水平又不高的人来说,刚进入c++总是有一些不习惯。 不过就如很多书上说的一样,c++能够提高开发效率(相较于c语言),不过无论学习什么都是需要学习成本的, 比如你开始使用c++的时候比起你熟悉的c语言可能效率会低,不过当你熟练掌握c++的时候,就是你收获的季节了。下面是一个使用c++ string的例子,删除一个字符串多余的空格(最前面,最后面的空格全部删除,中间有连续空格的地方只留下一个)
#include <string>
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
void delOverSpace(string &h)
{
unsigned int n = 0;
unsigned int i = 0;
unsigned int j = 0;
while ( (n = h.find_first_of(' ', 0)) != string::npos && n == 0 )
h.erase(n, 1);
while ( (n = h.find_last_of(' ', h.size() - 1) ) != string::npos && n == h.size() - 1 )
h.erase(n, 1);
while ( (n = h.find_first_of(' ', i)) != string::npos) {
j = n + 1;
while ( h.find_first_of(' ', j) == j )
h.erase(j, 1);
i = j;
}
}
int main()
{
string str;
cout << "input a line " << endl;
while (1) {
cout << ">>>>>>>>>>>>>>>";
getline(cin, str);
delOverSpace(str);
cout << str.size() << " charators of : "
<< str << endl;
if ( str.compare("quit") == 0 )
break;
}
return 0;
}
刚开始写这样的代码的时候,要去看很长时间的c++ string 接口的手册, 而且心里肯定会嘀咕说,string::erase的效率肯定会很低, 我用c语言很快就能搞定什么的。 但是我们要告诫自己,使用成熟的库,是我们写出健壮的代码的重要武器。 而且c++的实现告诉我们,他几乎不会存在执行效率的问题。我们可以放心。