string对象操作
写在前面:突然有兴趣复习一下string对象的操作使用,因为个人感觉string的操作处理还是很重要而且实用的。想要用的时候问题就来了,经常忘记怎么用,自己就很生气也很吃亏。写一篇博客也算是加强一下基础,方便用的时候来看一下。
熟能生巧,反复熟悉一下string的特性,其中有些是C++11有的特性。
getline(is,s); //从is中读取一行赋给s,返回is
s[n]; //返回s中第n个字符的引用,位置n从0开始
s.empty(); //返回布尔值判断字符串是否为空
s2 = s1; //s2副本代替s1
s2 == s1; //如果s1和s2字符完全一样,它们相等(包括大小写)
……
列举一些常用的操作,同时也是容易记混的,这样以后用的时候就能少看一点参考……
string s1; //空字符串初始化
string s3 = "houa"; //s3是字面值的副本
string s4(10, 'c'); //s4: cccccccccc
string s5("value"); //s5是字面值的副本
string s2(s1); //s2是s1的副本
读写string对象
引入头文件string之后,就可以用iostream来对string对象进行读写的操作。
读写iostream也有好几种方法,列举一点常用的就行。
string s; //空的字符串
cin >> s; //遇到空白结束;
cout << s << endl;
cin >> s1 >> s2; //读入2个字符串,空格为结束标志
cout << s1 << s2 << endl;
初始化一个字符串s,对它进行读写的时候,使用cin来进行读取字符串。
这样做的话,遇到空格就会结束读取字符串。同样地,如果初始化2个字符串对象,分别读入s1和s2,很显然空格就是判断s1结束读入而开始s2读入的标志。这样输入“Hello World!”的时候,输出s就会得到结果 “Hello”;而s1、s2输出就能得到“HelloWorld!”。
简单的说,读进去的是一个词。
使用getline()函数就可以读入一整行的字符串,而不会遇到空格就结束,值得注意的是这里读入的最后一个换行符并不会存入到string对象中去;如果一开始就是空字符串,那么getline()就直接读入换行符,但不会存到string里面。
如前面提到过的getline(is, s)就是把is赋给s,这里使用cin读入字符串到line。因而输出的是一行。
string line;
getline(cin, line); //获取一行字符串,直到遇到换行符,读入换行符
cout << line << endl; //string对象不会存入换行符
按照上面的输入,这里就能得到输出“Hello World!”一整行字符串。
size和empty操作
size()和empty()也是很常用的对string对象的操作。
//size & empty
line.empty(); //判断字符串空,bool
line.size(); //返回string对象的长度
auto len = line.size();
字面值和string对象相加
string对象和字面值相加,字面值也会转换为string。但是值得注意的是字面值之间不能相加,这样是错误的。简单的记就是,”+”的两侧必须有一边是字符串,不能全是字面值。
string str = s1 + ", " + s2; //正确
str = "Hello" + ", " + s2; //错误,报错
处理每个字符
有时候也想处理string里面的每一个字符,使用范围for就能实现。
for(定义:对象)
语句
一些小例子:
//range for处理字符串
for (auto c : str)
cout << c << endl;
for (auto &c : str)
c = toupper(c);
cout << str << endl;
可以获取str中的每一个元素,并打印出来,每行打印一个字符;也可以使用引用&c把字符串里面的元素全部转换为大写,引用可以修改目标值。
顺便贴出一些函数
isalnum(s1[0]); //字母或数字为真
isalpha(s1[0]); //字母时为真
isdigit(s1[0]); //数字时为真
islower(s1[0]); //小写字母时为真
ispunct(s1[0]); //标点符号时为真
toupper(s1[0]); //如果参数是小写字母,则转换为大写字母
再看了一遍还是感觉到颇有收获的,还是要继续学习一番。
参考书目《C++ Primer 5th》