最近常常遇到字串相關的考題,於是整理出來了三個常考的知識點。一、
c/c++中每個字串都以』\0』作為結尾,這樣就能很方便地找到字串的最後尾部。但由於這個特點,每個字串都有乙個額外字元的開銷(如空字串其實有乙個字元』\0』),如果不加以注意就會造成字串的越界。另外,在進行字串複製的時候,忘記複製』\0』也會引起錯誤。關於這方面的例項參考strcpy函式的實現
二、
c/c++為了節省記憶體,把常量字串放到乙個單獨的記憶體區域,即靜態記憶體區。當幾個字元指標被相同的常量字串賦值時,字元指標都指向常量字串的首位址,也就是說它們指向了相同的記憶體位址。但是,用常量字串初始化陣列時,會為陣列重新分配記憶體,並把字串逐一複製到陣列的記憶體中去,也就是說陣列的記憶體位址與常量字串的記憶體位址不同。為幫助理解,來一道例題,判斷以下程式的輸出結果是什麼,並說明原因。
int main() {
char *str1 = "abc";
char *str2 = "abc";
const char str3 ="abc";
const char str4 ="abc";
const char *str5 ="abc";
const char*str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout<< ( str1 == str2 )<<" ";
cout<< ( str3 == str4 )<<" ";
cout<< ( str5 == str6 )<<" ";
cout << (str7 == str8 );
輸出結果為:1 0 1 1三、原因:str3,str4是陣列,所以它們有各自不同的記憶體空間;str1,str2,str4,str5,str6,str7為字元指標,所以它們指向了相同的記憶體位址。
當函式返回值為非引用或指標型別時,返回值不管是區域性變數或全域性變數,還是靜態變數,返回的是值的乙個複製。當函式返回值為引用或指標型別時,不能返回區域性變數的指標或引用。因為函式執行完畢後會釋放分配給區域性變數的儲存空間,所以函式返回的對區域性變數的引用或指標會指向不確定資料的記憶體。這個知識點說的有點不清不楚,來看一道例題:
以下兩段程式,判斷兩段程式的輸出結果是否相同,如果不相同請說明原因。
程式一
char *getm() {
char p=」hello world」;
return p;
int main() {
char *str=null;
str=getm();
printf(str);
程式二
char *getm() {
char *p=」hello world」;
return p;
int main() {
char *str=null;
str=getm();
printf(str);
答案是輸出不同的結果。程式一輸出亂碼,程式二輸出」hello world」
程式一用常量字串」hello world」初始化陣列p,所以編譯器為陣列p重新分配了記憶體,並把」hello world」逐字元複製到了p陣列的記憶體中。但是,getm函式中宣告的陣列p為區域性變數,在執行完getm函式後編譯器會釋放陣列p的記憶體。getm函式返回的陣列p的首位址指向未知資料記憶體位址。
程式二用常量字串」hello world」初始化指標p,所以p指向了儲存」hello world」的靜態記憶體區。執行getm函式不會釋放靜態記憶體區的記憶體,所以getm函式返回的指標指向常量字串」hello world」的首位址。
常用的三個字串型別剖析
常用的三個字串型別有string,stringbuffer,stringbuilder 它們的底層資料結構都是字元陣列。string 底層陣列是乙個被final描述的字元陣列。所以不可變 繼承了abstractstringbuilder,abstractstringbuilder裡定義了乙個字元陣列...
刪除字串中相鄰三個或以上重複的字元
對於輸入的字串,我們需要完成的任務是從左到右掃瞄字串,如果存在由三個以上 包括三個 連續相同字元組成的字串,就將這個子串從原串中去掉,並將原串剩下的部分拼接到一起。重複上述過程,直到無法去掉任何子串。示例 input aaabccdddcb aabbbabbba outputbba 分析 對於這個問...
abc三個字串 字串壓縮演算法(騰訊筆試題)
將長度為n的字串a通過設定的演算法,轉換為長度為m且小於n的字串b,字串b通過相應的演算法,可以再次轉換為字串a,該演算法稱為字串壓縮演算法。問題小q想要給他的朋友傳送乙個神秘字串,但他發現字串的長度過長,於是小q發明了一種壓縮演算法對字串重複的部分進行了壓縮。對於字串內連續的m個相同的子串s將會壓...