标准类型string,字符串的声明string大家都比较熟悉,下面来讲述一些与c语言不同的细节问题:
1.string声明的变量,输出结果中不会出现空格;
例如:string s;
cin>>s;
cout<<s<<endl;
输入:" Hello world";
输出的结果为"Hello";(注意开头和结尾出的空格)
2.string中的size和size_type
我们都知道c语言一个字符串s的长度就是l=strlen(s);而c++中字符串的长度直接就是l=s.size();当然size_type类型(可以存放任何string对象大小)和size函数返回的值都是无符号数;为了更好理解例子如下:
string line;
auto len=line.size(); // len的类型是 string::size_type,auto(根据变量推断声明变量的类型)前面章节已经介绍。
3.比较string对象
string字符串比较大小运算符都依照(大小敏感)字典顺序:
A.如果两个string对象的长度不同,而且较短string对象的每个字符都与较长的string对象对应位置上的字符相同,就说较短string对象小于较长string对象;
B.如果两个string对象在某些对应的位置不一致,则string对象比较的结果其实是string对象中第一个对相异字符比较的结果。其中相同字母小写字符大于大写字符(我们也知道他们相差32数值);
为了更好理解上面的意思,例子代码如下:
#include<iostream>
using namespace std;
int main()
{
string s1,s2;
cout<<"请输入两个字符串:"<<endl;
while(cin>>s1>>s2) //
{
if(s1>s2)
cout<<"s1>s2"<<endl;
else if(s1==s2)
cout<<"s1=s2"<<endl;
else
cout<<"s1<s2"<<endl;
}
}</span>
4.string对象赋值和两个string相加和字面值
A.string对象的赋值:
string st1(10,'c'),st2; //st1的内容就是10个c;st2是空字符串;
st2=st1; //赋值,st1和st2都相同了,相当于字符串的复制(c语言字符串的复制这样是不行的)
B.字面值和string对象相加
string s1="hello, ",s2="world\n";
string s3=s1+s2; //s3的内容是hello, world\n
c语言中两个字符串的合并:
while(*s1++);s--;
while(*s1++==*s2++),c语言明显比这个要复杂;
需要注意的是相加至少有一个是string,而不能两个字面值相加:
string s4=s1+","; //一个string对象和一个字面值相加,正确;
string s5="hello, "+"world\n"; //相加的两个对象都是字面值,从而是错误的;
5.处理string对象中的字符,表格如下:
字符 | 解 释 |
---|---|
isalnum) | 当c是字母或数字是为真 |
isalpha() | 当c为字母时为真 |
iscntrl(c) | 当c为控制字符时为真 ps:空格不算,\n \b \t 都不算 |
isdigit(c) | 当c是数字时为真 |
isgraph() | 当c不是空格但可打印时为真 |
isprint(c) | 当c是可打印字符时为真(即c是空格或c具有可是形式) ps:\b \t 为假 |
ispunct() | 当c是标点符号时为真(即c不是控制字符、数字、字母可打印空白的一种) |
isspace() | 当c是空白时为真(即c是空格、横向制符表符、纵向制表符、回车符、换行符、进纸符中的一种) |
isupper() | 当c为大写字母时为真 |
isxdigi() | 当c是16进制数字为真 |
tolower() | 当c是大写字母,输出对应的小写字母;否则原样输出; |
toupper() | 当c是小写字母,输出对应的大写字母;否则原样输出; |
islower() | 当c是小写字母时为真 |
上面的不需要记忆,多运用就会熟人生巧,ps很值得小心,望大家注意!
总结:
C++string字符串相比C语言对字符串的处理更加方便,主要是string封装做的比较好;string对字符串的处理有许多性质是值得掌握的:例如string相加和字面值,比较string对象运用的场合比较多;
C++11特性:
for范围语句:可以对string对象中的每个字符进行操作;
for的语法形式:
for(A:B)A表示定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,A大的变量将被初始化为B的下一个元素值。
string str("some string");
for(auto c: str)
cout<<c<<endl; //每输出一个字符换行,再次输出下一个字符;依次进行下去,直到结束;
有c语言基础的看到这样的语句一定会觉得不可思议;这如何循环,当然这样的语句编译器支持C+11特性才行; C++特性迭代,auto也是C++特性根据后面变量从而定义c为char类型,循环把变量c和str联系了起来,其中我们定义循环控制变量的方式与定义任意一个普通变量是一样的。
再次引入另外一个例子:
string s("Hello world!!!");
for(auto &c: s) //c是引用,将c与s中每个字符绑定
c=toupper(c); //toupper(c)将小写字母变大写字母,赋值给c从而改变s中字符的值;
cout<<s<<endl;
输出结果为: HELLO WORLD!!!
当然如果只对字符串某个字母进行处理,这时就需要运用下标运算符(和c语言一样处理方式);其中特别注意下标的范围,超出范围会出现溢出错误即乱码输出(c语言也是);下一个总结将写vector容器(比较重要)将它分开来总结;
温馨提示:大家相互学习,如果有习题需要解答的也可以留言!!我是一名菜鸟!