天天看点

字符指针,字符串,字符数组比较以及衍生问题 字符指针、字符数组不能直接比较 例子:sizeof和strlen

字符指针、字符数组不能直接比较

 strcmp()         对两个字符串进行大小写敏感的比较

 strcmpi()        对两个字符串进行大小写不敏感的比较

 stricmp()        同strcmpi()

 strncmp()       对两个字符串的一部分进行大小写敏感的比较

 strnicmp()      对两个字符串的一部分进行大小写不敏感的比较

(此部分复制网上部分,见谅,大家重复太多啦)

STL标准库中的std::string重载了==运算符

使得string可以直接和const char* (C风格字符串)直接比较

St.replace()//替换

St.size();//返回长度(不包含空字符)

St2.empty()//检查是否是空

//复制两个字符串

String st3(st);

St2=st3

//比较是否相等

If(st2==st3){….}

/两个字符串连接成第三个字符串

String s1(“hello,”);

String s2(“world!”);

String s3=s1+s2;

//或者,直接加到s1

S1+=s2;

//可以把一个c风格的字符串转换成string类对象

Const char *pc=”a try”;

String s1=pc;//ok

//但,反向的转换不能自动执行

Char *str=s1;//error

为实现这种转换必须显示调用名为c_str()

//几乎正确的

char *str=s1.c_str();

但为了防止字符数组被程序直接处理,c-str()返回的一个指向常量数组的指针:const char*,str被定义为非常量指针,所以违例。正确是:

Const char *str=s1.c_str();//ok

St.compare()//比较

例子:

char buf[] = "Geooo";// 其末尾还包括了一个\0, 是一个数组,可以改变数组中保存的内容( 字符数组 ) char* buf1 = "Geooo";// 字符指针指向的是一个字符串常量的首地址,可以改变它指向不同的字符串,但不能改变所指的字符串常量(字符指针) string buf2 ="Geooo";(字符串)// 新的C++标准 C++11里面规定std::string一定是以'\0'结尾 就看你的编译器有没有实现新标准了 char buf3[] = {'G','e','o','o','o'};( 字符数组) char buf4[] = {'G','e','o','o','o','\0'};( 字符数组)等价于buf[]

bool ibool=strcmp(buf2.c_str(), "Geooo");//buf,buf1,buf2,buf4用strcmp比较都是相等,返回0 bool ibool = strcmp(buf, buf3)//1 bool ibool = strcmp(buf, buf4)//0 bool ibool = strcmp(buf3, buf4)//1

if (buf == "Geooo")//不等 if (buf1 == "Geooo")//相等 if (buf2 == "Geooo")//相等 if (buf3 == "Geooo")//不等 if (buf4 == "Geooo")//不等

if (buf == buf2)//相等 if (buf1 == buf2)//相等 if (buf == buf1)//不等 if (buf == buf4)//不等

cout << strlen(buf);//5 cout << sizeof(buf);//6, 字符串数组,编译自动在后面加上了"\0"结束符

cout << strlen(buf1);//5 cout << sizeof(buf1);//4,指针的字节数

cout << strlen(buf2.c_str());//5 cout << sizeof(buf2);//28,string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的 cout << sizeof(buf2.c_str());//4,指针的字节数

cout << strlen(buf3);//19,不定, 原来strlen在计算数组长度的时候是遇到‘\0’时计算就停止,如果不在字符数组后面加上‘\0’,那么strlen就会一直计算下去,知道遇到内存中的'\0',才停止计算。 cout << sizeof(buf3);//5,字 符数组,编译器不会再后面加"\0"结束符

cout << strlen(buf4);//5 cout << sizeof(buf4);//6

buf[0] = 'l';//可以, 由字符串常量初始化的数组是可以修改的 buf1[0] = 'l';//错误,字符指针指向的是一个字符串常量的首地址 buf2[0] = 'l';//可以 buf3[0] = 'l';//可以

cout<<sizeof(buf3) / sizeof(buf3[0]);//5

char buf5[] = {'Goo','e','o','o','o','\0'}; cout<<sizeof(buf5) / sizeof(buf5[0]);//6

char* buf6[] = {"Goo","e","o","o","o","\0"}; 指针数组 cout<<sizeof(buf6) / sizeof(buf6[0]);//6

char* buf7[] = {"Goo","e","o","o","o"}; 指针数组 cout<<sizeof(buf7) / sizeof(buf7[0]);//5

字符串与字符数组

对字符串指针方式,char *ps=”C Language”;

可以写成char *ps;ps=”C Language”;

而对于数组方式,char st[]={”C Language”};

不能写成char st[20];

St={”C Language”};

只能对字符数组的各元素逐个赋值。

指针数组和数组指针的区别

int* a[4]     指针数组     

                 表示:数组a中的元素都为int型指针    

                 元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

int (*a)[4]   数组指针     

                 表示:指向数组a的指针

                 元素表示:(*a)[i]  

字符指针如何判断字符串结束

int i = 0;

while (*buf1 != NULL)

{

buf1++;

i++;

}

cout << i << endl;//5

sizeof和strlen

继续阅读