有些題目在定義函數的時候采用的是char指針或者字符串傳參,自己習慣STL的string,不太熟悉。所以這里對C語言中的Char數組做個總結;
關於Char字符串的初步概述:
相當於Int數組,只不過是char類型的。
但是需要注意的是Char數組在定義的時候一定要注意,結尾的'\0'是占一個位置的,如果忽略該字符,會導致異常的錯誤;
每一個char[]都以終結字符作為結尾,注意一下;
關於Char數組的長度問題:
注意關於sizeof和strlen的問題,兩者的計量標准不同;
1.對於strlen來說,計量標准為字符串數組中的非終結符字符個數;
2.對於sizeof來說,計量標准為字符串中的所有位數,包含非終結符號;
對於相同的字符串char[]="12345";
strlen的結果為5;
sizeof的結果為6;
所以一般來說統計實際字符個數用strlen,而一般開辟賦值使用sizeof;
關於Char* 和 Char[] 的數組問題:
首先,對於C語言來說,char*是一種比較特殊的存在。
在之前OJ的題目中,有一道題有這樣一個坑:
之前遇到這個問題,發現char* 傳進去並不能改變實參,本質上的問題在於沒有理解char*指針是個什么東西;
char[]本質上就是一個連續的區域,內部存儲char元素;
一般的賦值語句:
char str[]="123124124";
str通常可以表示為一個指針,也就是char*,這個指針指向連續的數組區域;
例如str[0]的地址為0x001;
則char*表示的是一個單元內的內容,是0x001,也就是裝着首字符的地址;
在通常情況下,char[]數組可以直接用char*來進行表示;
其次,重要的是訪問問題;
盡管當str作為char*指針存在,但是由於字符串數組的特殊性質,可以直接對其進行下標訪問,而不用使用指針的解引用訪問;
但是一定要注意范圍,因為如果不知道范圍,有可能越界。
這個玩意不像C++的string,越界會報錯;
因此對於該題目中,如果按照形參不傳引用而是直接拷貝,則代表兩個指針同時指向原來的char數組的首個元素;
所以對於自己起初的錯誤寫法,針對於函數內部有:
c=(char*)molloc(sizeof(s)+1);
則改變的是c指向的空間,也就是重新開辟了一個數組,和之前的實參指針半點關系都沒用,函數結束就自動銷毀;
所以如果理解指針的特性,直接采用對指針指向的區域進行改造:
則直接就會把傳進來的字符串進行改造,使得不用傳引用就可以進行修改;
關於char數組的賦值問題:
關於賦值問題也要注意一下;
通常來說char數組賦初值有以下幾個方式:
1.直接指定:
2.開辟空間:
這一般是進行重新賦值的時候;
c = (char*)malloc(sizeof(s) + 1);
之后再利用strlen進行填補也可以;
當然也可以利用strcpy,但是注意,空間一定要開的足夠大,並且賦值的時候,編譯器會默認在結尾加上'\0';
利用該函數也可以對其進行string STL庫賦值,只不過要用string.c_str()函數;
注意:關於截斷功能;
對於一個字符串,如果想從中間截短,直接在其中一位賦值'\0',即可截斷;
個人覺得應該是在統計字符個數和輸出時候,都以'\0'來作為結尾的;