c++primer之string

来源:互联网 发布:手机我的世界拔刀剑js 编辑:程序博客网 时间:2024/05/16 01:05

标准库类型string

标准库类型string表示可边长字符序列,使用string类型必须包含string头文件string定义在命名空间std中。

 #include <string> using namespace std;

定义和初始化string对象

  **初始化string对象的方式**
      string s1;  // 默认初始化,s1是一个空串      string s2(s1);  //s2是s1的副本      string s2 = s1;  // 等价于s2(s1),s2是s1的一个副本      string s3("value");  // s3是字面值"value"的副本,除了字面值最后的那个空字符串外      string s3 = "value";  // 等价于s3("value")      string s4(n,'c');  // 把s4初始化为由连续n个字符c组成的串      string s5 = string(n,'c');

如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化
如果不使用等号,则执行的是直接初始化

string对象上的操作

string s;  os << s;  // 将s写到输出流os中,返回osis >> s;  // 从is中读取字符串赋给s,字符串以空白分割,返回isgetline(is,s);  // 从is中读取一行赋给s,返回iss.empty();  // s为空返回true,否则返回false。s.size();  // 返回s中的字符个数。s[n];  // 返回s中第n个字符的引用,位置n从0记起s1 + s2;  //  返回s1和s2连接后的结果s1 = s2;  // 用s2的副本代替s1中原本的字符s1 == s2;  // 如果s1和s2中所含的字符完全一样,则它们相等s1 != s2;   // string字符的相等性判断对字母的大小写敏感< , <= , > , >=;  // 利用字符在字典中的顺序进行比较,且字母的大小写敏感

读取未知数量的string对象

int main(){    string wordwhile(cin>>word)            cout << word <<endl;    return 0 ;}

使用getline读取一整行
getline只要一遇到转行符就结束并返回结果,哪怕输入的一开始就是换行符(这将得到一个空的string)。

int main(){    string line;    // 每次读入一整行,直至到达文件末尾。    while(getline(cin,line))            cout << line <<endl;    return 0 ;}

string::size_type
size函数返回类型是一个string::size_type类型的值,是无符号的整型,**因此切忌,如果表达式中混用了带符号和无符号将可能产生意想不到的结果。

例如:假设n是一个int负值,则表达式s.size()<n的判断几乎肯定是true// 如果一个表达式有了size()函数就不要用int了,这样可以避免混用int和unsigned可能带来的问题。// 具体使用的时候,通过作用域操作符来表明**名字size_type是类string中定义**。// 在不知道size函数返回类型返回值情况下,C++11新标准:auto len = line.size(); // len类型是string::size_type

string相加

string s1 = "hello,", s2="world\n";string s3 = s1 + s2;  // s3的内容是hello,world\nstring s1+=s2;  // s1 = s1+s2;string s1 += "world\n";string s4 = "hello" + "," +s2; //错误:不能把字面值直接相加 // 相加时,必须保证每个加法运算符(+)的两侧的运算对象至少有一个是string。

处理string对象中的字符

这里写图片描述

处理每个字符? 使用基于范围的for语句
目前最好的办法是使用C++11新标准提供的语句:范围for(range for)语句。
其语法:

for(declaration : expression)     statement

其中,expression部分是一个对象,用于表示一个序列。declaration部分负责定义一个变量,该变量将被用于访问序列的基础元素。每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素。

例子:string str("some string");// 每行输出str中的一个字符。for(auto c : str)   // 对于str中的每个字符     cout << c << endl;   // 输出当前字符,后面紧跟一个换行符

使用范围for语句改变字符串中的字符
如果想要改变string对象中字符的值,必须把循环变量定义成引用类型。

例子:string s("Hello world!!!");// 转换成大写形式。for(auto &c : s)  //对于s中的每个字符(注意:c是引用)      c = toupper(c);  // c是一个引用,因此赋值语句将改变s中的字符的值cout << s << endl;

只处理一部分字符
想访问string对象中的单个字符有两种形式:一种是下标,另一种是使用迭代器。
string对象的下标必须大于等于0而小于s.size()。

// 使用下标:string s("some string");if(!s.empty())    s[0] = toupper(s[0]);  // 输出为Some string
//使用迭代for (decltype(s.size()) index = 0; index != s.size() && !isspace(s[index]); ++index)     s[index] = toupper(s[index]);  //输出为SOME string
0 0