相信学习过计算机编程的人,基本应该都接触过C语言,在C语言中处理字符串大家一定多遇到过,
也都知道处理字符串非常麻烦,而在C++里面,由标准库string类提供对可变长的字符串的支持。下面
来看看string类的特性。
1、使用的先决条件
在使用标准库之前必须包含相应的头文件, 要使用string类型,就需要包含相应的头文件,如下所示:
#include <string>
在使用iostream的时候,我们未来引用iostream里面的类,前面需要加上 std:: 来表示引用的是标准
IO库提供的功能,同样在使用string类的时候,需要加上一个表示作用域的限制修饰的说明,如下所示:
std::string str; //定义一个string的对象str
在每一次定义的时候都要这样使用 std:: 很麻烦,C++提供了一种更方便的机制,如下:
using std::string;
在源文件里面加上上面这一句, 在使用的时候,就可以直接使用 string来定义对象,如下所示:
string str;
2、string类的初始化
string类提供了多种初始化方法:
1) string str; //初始化为空字符串, 调用默认构造函数,
2) string str2="volcanol"; // 赋值初始化,复制str2为"volcanol"的一个副本,
3) string str1("volcanol"); //直接初始化,调用初始化函,
4) string str1="volcanol"
string str2(str1); //利用 string对象初始化string str对象
5) string str1(3,'c'); //初始化str1为"ccc",
3、string对象的读写
可以利用iostream提供的输入和输出机制来对string对象进行操作。
输入:
string str; cin>>str;
这样就可以通过标准输入来输入字符到string对象中, 要注意的是:
A) cin在输入的的时候会忽略开始的空白符(空格,制表符,换行符),然后从非空白字符开始读入
B) cin在输入的时候,会在再次遇到空白字符后结束输入。
这里的意思就是: 通过 cin>>str读入的字符流不会包含 endl 换行符,因此如果要换行的话,就
需要自己添加换行符。
同样可以利用cout<<来输出string对象,如下所示:
cout<<str<<endl;
下面是一段例子代码:
#include <iostream> #include <string> using std::cin; using std::cout; using std::endl; using std::string; int main(int argc,char *argv[]) { string str; while(cin>>str) cout<<str<<endl; return 0; }
执行情况如下所示:
[root@localhost cpp_src]# g++ test.cpp [root@localhost cpp_src]# ./a.out a //输入a 然后按回车键 a ab //输入ab,然后按下回车键 ab aaa bbb ccc //输入aaa bbb ccc 按下回车键 aaa bbb ccc
按下 ctrl+d 就会退出上面的程序, 这里while循环判断 cin>>str 是否遇到 end-of-file 结束符,
当按下ctrl+d后, cin>>str 返回 false, 结束循环。
4、getline函数的使用
通过调用 getline函数可以一次输入一行, 这里需要注意的是:getline不会忽略开始的换行符,而是会
忽略最后的换行符,而且getline在遇到 空格、制表符的时候,不会结束一行的输入,直到遇到endl换行符。
getline()接受两个参数: getline(cin, str);
Exp:
[root@localhost cpp_src]# cat test.cpp #include <iostream> #include <string> using std::cin; using std::cout; using std::endl; using std::string; int main(int argc,char *argv[]) { string str; while(getline(cin,str)) cout<<str<<endl; return 0; }
执行结果如下:
[root@localhost cpp_src]# g++ test.cpp [root@localhost cpp_src]# ./a.out aaa bbb ccc ddd //输入aaa bbb ccc ddd按下换行 aaa bbb ccc ddd //直接输入换行 //直接输入换行 12345 //输入12345 按下换行 12345
这里需要注意的是: getline不会忽略一行开头的换行符,而且输入后在string对象最后不会加上endl换行符。
5、string的操作
string类型提供了很多的操作, 下面我们来看一下:
string str;
str.size(); 返回str对象的长度
str.empty(); 判断str是否是空字符串
str[n]; 下标操作,取其中的一个字符
str1 + str2;
str2 =str1;
str1 == str2
还有 != , <, <=, >,>= 这些比较操作,这些操作与整数型的操作的意义一样,但是string的
比较是按照字典序,同时区分大小写, 满足下面的关系:A < a
Exp: 关于str.size() 函数计算的长度,
[root@localhost cpp_src]# cat test.cpp #include <iostream> #include <string> using std::cin; using std::cout; using std::endl; using std::string; int main() { string str1; string str2; cout<<str1.size()<<endl; cout<<sizeof("")<<endl; return 0; }
执行结果如下所示:
[root@localhost cpp_src]# g++ test.cpp [root@localhost cpp_src]# ./a.out 0 1
通过上面的例子可见, str.size()函数计算长度的时候并不包括最后的null字符' ', 这一点需要注意。
还有一个特殊的地方: 就是 sizeof对 str对象的计算,得到的结果,与str.size 得到的结果不一样,
因此需要注意。如下代码所示:
[root@localhost cpp_src]# cat test.cpp #include <iostream> #include <string> using std::cin; using std::cout; using std::endl; using std::string; int main() { string str1; string str2; cout<<str1.size()<<endl; cout<<sizeof("")<<endl; cout<<sizeof(str1)<<endl; return 0; }
上面代码的执行结果如下所示:
[root@localhost cpp_src]# g++ test.cpp [root@localhost cpp_src]# ./a.out 0 1 4
这里是因为 string对象会保留4个字节来存储string对象的长度。
Exp: 关于 str.empty()函数的使用
[root@localhost cpp_src]# cat test.cpp #include <iostream> #include <string> using std::cin; using std::cout; using std::endl; using std::string; int main() { string str1; string str2; if(str1.empty()) { cout<<"str1 is a empty string"<<endl; } else { cout<<"str1 is not a empty string"<<endl; } return 0; }
执行结果如下:
[root@localhost cpp_src]# g++ test.cpp [root@localhost cpp_src]# ./a.out str1 is a empty string
这里可以知道的是,如果string对象是一个空字符串,那么 str.empty()函数返回true。
其实也可以通过 str.size( )==0 来判断string对象是不是为空。因为 str.size()不会计算最后的 ‘