1.字符串常量、C风格字符串
1.1 字符串常量是一个const char类型的数组,例如
"i am a string"
该字符串常量在数组中以空字符'\0'结尾。
当这样的字符串出现在程序中时,实际上是通过字符指针 char* 访问该字符串的,字符指针char*总是指向字符串常量的第一个字符。
1.2 我们来分析下面的程序片段
char *pmessage;
pmessage="now is the time"; //C风格字符串
该程序首先分配了16个char型的连续内存空间,分别初始化为'n','o','w',‘ ’,'i','s',' ','t','h','e',' ','t','i','m','e','\0',然后用一个字符型指针char*指向这段内存空间的第一个字符空间,也就是指向'n',该字符指针名为pmessage。在这个过程中并没有字符串的复制,只涉及到指针的操作。
这里的“now is the time\0”就是一个C风格字符串,其本质是以'\0'结束的字符数组。
1.3 下面有两种有关字符串常量的初始化,注意两者之间的区别
char amesssage[]="now is the time";
//这里的amessage[]是一个字符数组,所以也就意味着可以通过 amessage[1]='z' 来对该字符串中的单个字符进行修改,修改后的结果是"nzw is the time"。amessage可以看做一个始终指向&amessage[0]的指针。
char *pmessage="now is the time";
cout<<pemssage[1]; //输出'o'
cout<<*(pemssage+2); //输出'w'
//这里的pmessage是一个指针,其初始值是一个字符串常量,pmessage可以修改指向其他的地址,但是无法修改“now is the time”这个字符串的内容。
1.4 一些关于C风格字符串的操作,在C++中需要包含头文件<cstring>,在C中需要包含头文件<string.h>
strlen(s) //返回s长度,该长度不包括字符串终止符'\0'
strcmp(s1,s2)
strcat(s1,s2)
strcpy(s1,s2)
strncat(s1,s2,n)
strncpy(s1,s2,n)
1.5 关于C风格字符串中>,<,==运算符的运用,我们来看下面的举例
string s1="she is a good girl";
char *cp1=s1;
char *cp2=s1;
if(cp1<cp2) //这里比较的是cp1和cp2的地址,而且必须在cp1和cp2指向同一个字符串数组时才有意义
......
string ss1="she is a good girl";
string ss2="she is a bad girl";
if(ss1>ss2) //这里比较的是ss1和ss2的字符串ASCII码值,即比较的字符串大小
......
1.6 C风格字符串的两种初始化方法
(1)
char *cp1="hello world";
const char *cp2="hello sea";
(2)在不知道字符串长度的情况下,可以申请动态内存(new),使用完成后再释放([]delete)。
const int len=100;
char *cp3=new char[len];
cin>>cp3; //从标准输入字符串,字符串长度不能超过100
2. string类型,#include <string>
注意:C语言中没有string类型
一些相关操作
s.empty()
s.size()
s[n] //返回s中第n位的字符
string 对象中对单个字符的处理,引入头文件<cctype>
【欢迎读者交流批评指正~】