c++中關於char陣列/char*指標/string型別 之間的愛恨情
小渣渣一直被有關string和char[]以及char*的相關問題弄得痛不欲生,傳參、返回值、函式呼叫等到底應該用哪種形式這真的是讓小渣癲狂了,今天就好好稍微整理一下吧(歡迎補充與指正)
大多也是我從各大網站各大部落格上面自己整理的,畢竟小渣也是對這個問題感到orz,但是我不會輕易的狗帶,接下來看吧……
…………………………………………………loading……………………………………………………………………………
C-串(C-strings):
introduce:char陣列
char buffer[7] ="HELLO!";//雖然字串只有HELLO!六個字元但是由於使用陣列來表示字串,字元後面還要有一個終止符'\n'
'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)
程式碼參考此部落格-->點此檢視
暫時先這樣以後有接著補充