C++ 字符串

C风格字符串

 c风格的字符串:存放在字符数组中,以'\0'结束;而c++主要以string类代替!对大多数应用来说,使用标准库string要比使用c风格字符串更安全,更高效。

举例:
string str = "123";//C++风格
char str[4]="123";//C风格

 

 

c风格字符串的函数:

char p[20],p1[20],p2[20];
strlen(p);//返回p的长度,空字符不计算在内!
strcmp(p1,p2);//比较p1和p2的相等性,如果p1==p2,返回0;如果p1<p2,返回一个负值,如果p1>p2,返回一个正值;
strcat(p1,p2);//将p2附加到p1之后,返回p1;
strcpy(p1,p2);//将p2拷贝给p1,返回p1;

  对于函数strlen(p),计算字符串的长度,其中p是指针。strlen()要计算字符串长度,必须知道哪里是结尾,因此使用'\0'表示结尾。传入此类函数的指针必须指向以空字符作为结束的数组:

char ca[]={'C','+','+'};//不以空字符结束!
cout<<strlen(ca)<<endl;//严重错误:ca没有以空字符结束,strlen函数可能沿着ca在内存中的位置不断向前寻找,直到遇到空字符才停下来。

  char a1[] = "abc", 等价于char a1[] = {'a','b','c','\0',}; strlen(a1)等于3,长度不包括'\0',假如这样写 char a1[] = {'a','b','c',}; strlen(a1)是多少? 答案不确定,因为strlen一直找到'\0'才认为是结尾。

   在C风格字符串中,不能像string类中那样用>、<来比较两个字符串,如果把这些运算符用在两个c风格字符串上,实际比较的是两个指针而非字符串本身,将产生一个错误。同样地,使用+号也类似,应该使用strcat()。

 

标准库类型string

  string表示可变长的字符序列,使用string类型必须首先包含string头文件。string定义在命名空间std中。

1、初始化

 

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"),s3是字面值“value”的副本
string s4(n,'c');//把s4初始化为由连续n个字符c组成的串!

 

2、string对象上的操作

os<<s;//将s写到 输出流os当中,返回os
is>>s;//从is中读取字符串赋给s,字符串以空白分隔,返回is
getline(is,s);//从is中读取一行给s,返回is
s.empty();//s为空返回true,否则返回false
s.size();//返回s中字符的个数;返回类型size_type,是一种无符号类型的值
s[n];//返回s中第n个字符的引用,位置n从0计起
s1+s2;//返回s1和s2连接后的结果
s1=s2;//用s2的副本代替s1中原来的字符
s1==s2;//相等判断
s1!=s2;//不等判断
<,<=,>,>=//利用字符在字典中的次序进行比较,且对字母大小写敏感

  在string中执行读取操作(cin>>str)时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇见下一处空白为止。例如输入时“    hello world   ”,输出将是”hello“。如果我们希望在最终得到的字符串中保留输入时的空白,这时应该用getline函数来代替原来的>>运算!

  两个string对象相加的问题,两个string对象可以使用+连接成一个新的string对象,这里要注意:当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string:

string s1="hello",s2="world";
string s3=s1+","+s2+'\n';//正确,输出为hello,world
string s4="hello"+“,”;//错误,两个运算对象都不是string

   访问string对象中的每一个字符,还可以使用下标运算符,下标从0计起,小于s.size()。使用超出此范围的下标将引发不可预知的结果。

posted on 2015-05-27 10:24  段朋成  阅读(204)  评论(0编辑  收藏  举报

导航