1. 程式人生 > >c++中關於char陣列/char*指標/string型別 之間的愛恨情

c++中關於char陣列/char*指標/string型別 之間的愛恨情

小渣渣一直被有關string和char[]以及char*的相關問題弄得痛不欲生,傳參、返回值、函式呼叫等到底應該用哪種形式這真的是讓小渣癲狂了,今天就好好稍微整理一下吧(歡迎補充與指正)

大多也是我從各大網站各大部落格上面自己整理的,畢竟小渣也是對這個問題感到orz,但是我不會輕易的狗帶,接下來看吧……

…………………………………………………loading……………………………………………………………………………

C-串(C-strings):

introduce:char陣列

char buffer[7] ="HELLO!";//雖然字串只有HELLO!六個字元但是由於使用陣列來表示字串,字元後面還要有一個終止符'\n'

,因此char陣列來表示字串的時候其最後會預設的多一個結束符'\n',因此定義的char陣列的大小是比字串的lenght還要多1,如下表:

'H' 'H' 'L' 'L' 'O' '!' '\0'

C-串是char*型別,的更精確一點是const char* in fact 所有的字面值型別都是const的(這句話我還在琢磨)

 char*稱為字元指標,雖然與字元陣列的型別是不相同的,但是操作上是一樣的。

★字元指標和字元陣列

一段程式來看二者的聯絡與區別

<pre name="code" class="cpp">#include<iostream>

using namespace std;

int main(){
cout<<("join==join" ? "":"not")<<"equal"<<endl;

char* str1 = "good";
char* str2 = "good";
cout<<(str1==str2 ? "" :  "not")<<"equal"<<endl;

char buffer1[6] = "Hello";
char buffer2[6] = "Hello";
cout<<(buffer1==buffer2 ? "" : "not")<<"equal"<<endl;

return 0;
}

console:

not equal  //因為兩個join的空間位置不同

not equal //兩個指標指向的位置不同

not equal //兩個陣列位於不同的位置

"=="直接判斷的是兩個變數的位置,即是否在記憶體中處於一個位置,即是否為同一個物件

為了比較兩個c串的內容是否相同 在C庫中專門設計了strcmp(char* str1,char* str2)按字典序進行比較(你懂得,str1大返回正,等返回0,小返回負)

此外還有C-串的複製問題

char* str1 = "Hello";
char* str2 = str1;//意味著str1和str2共享一段記憶體空間,釋放掉str1即釋放掉str2,修改str1就是修改str2

char buffer1[6] = "Hello";
char buffer2[6] = buffer1;//error:陣列是不能複製的,小渣對此深有體會,上次考試就是這樣編,最後連編譯都沒有通過,這是多麼痛的領悟

Reason:因為陣列是定大小的,如果陣列可以進行復制的話,那麼將一個長度長的陣列賦值給一個長度短的陣列,這是多麼喪病呀,所以一不做二不休,陣列是不能的複製的

但是我們的偉大的C庫中提供了大量的函式,解決了複製問題(①複製,但是卻不是共享空間,而是空間不同內容相同②使字元陣列或者C-串[只要是字元指標型別就好]的被複制到另一箇中)

Let's see!

char* strcpy(char* x1 , char* x2);

//該函式將X2字串的內容拷貝到X1所在的位置,不論X1之前是什麼內容,拷貝之後都會被覆蓋

char* strcat(char* x1 , char* x2);

//將X2字串的內容接在X1之後

char* strrev(char* x)

//將x的內容倒置

char* strset(char* x ,char b)

//將X中的所有的字元都被字元b所替換

int strstr(char* x , char* s)

//在x字串總查詢s字串,查詢到返回1 否則0

int strchr(char* x , char b)

//在x字串總查詢b字元,查詢到返回1 否則0


以上的函式在使用的時候,注意是否指標越界,編譯器應該是不會幫助檢查的,比如x1和x2複製或者拼接要考慮X1最後得到的x1的長度不能超出原來的x1的長度,否則指標會越界,可能會出現錯誤

    char str1[] = "Hello";                      //字串陣列  
    cout<<"sizeof(str1)="<<sizeof(str1)<<endl;    //sizeof計算佔用的空間,包括\0  
    cout<<"strlen(str1)="<<strlen(str1)<<endl;    //strlen計算字串長度,不包括\0  
  
    char* str2 = "Hello";                       //字串指標  
    cout<<"sizeof(str2)="<<sizeof(str2)<<endl;    //sizeof計算指標=4 <span style="color:#ff0000;">I don't know why!! give me a hand </span>
    cout<<"strlen(str2)="<<strlen(str2)<<endl;    //strlen計算字串長度,不包括\0

最後一段程式碼參考此部落格-->點此檢視

string:

string是C++的STL提供的一種自定義的型別,它能方便的執行C-串不能直接執行的一切操作

1).定義與宣告(definition&statement)

string的定義,如下

<span style="font-family:Comic Sans MS;">string str1 = “hello”;
string str2(“hello”);
string str3(15,'a');//十五個’a‘字元組成的字串
string str4(15);//十五個空格字元組成的字串</span>


2).關於"=="

string實體之間進行"=="的比較是直接進行字串內容的比較

cout<<(str1==str2 ? "":"not")<<"equal"<<endl;//Anwser is "equal"!!!!

3).string型別還能進行"+"和"+="的拼接(同java)

4).string實體也是一種容器(參考vector)

 //2.string類  
    //a.定義和初始化  
    string s1;                          //預設無參構造,空串  
    string s2(s1);                      //拷貝構造  
    string s3(s2,0);                    //s2內位置字元初始化s3  
    string s4(str1);                    //使用c風格字串初始化  
    string s5(10,'a');                  //生成個a的字串  
  
    //b.常用操作  
    s1 = s5;                            //賦值,也可使用assign。s1內容清空,然後將s5的內容拷貝到s1處  
    s1 += s5;                           //尾部新增,也可使用push_back,append  
    s1.insert(0,str2);                  //插入字元(在0位置)  
    s1.size();                          //返回字元數量,也可用length  
    s1.c_str();                         //返回C—串,data()返回字元陣列不包括\0,c_str()包括\0,  
                                        //copy()則把字串的內容複製或寫入既有的c_string或字元陣列內  
    s1.empty();                         //檢測是否為空  
    string::iterator iter = s1.begin(); //返回迭代器,rbegin為逆向迭代器  
  
    s1.compare(s2);                     //比較  
    s1.find('a',0);                     //從0位置開始查詢a,返回位置  
    s1.replace(0,10,str2);              //刪除從開始的10個字元中[0,10),然後插入str2  
    s1.erase(0,10);                     //刪除從開始的10個字元[0,10)  

程式碼參考此部落格-->點此檢視

暫時先這樣以後有接著補充