天天看點

字元指針,字元串,字元數組比較以及衍生問題 字元指針、字元數組不能直接比較 例子: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

繼續閱讀