在c/c++中,字串是以零('\0')結尾的。比如,對於下面的字串:
"hello word"
在最後乙個字元'd'後面,還有乙個我們肉眼看不見的'\0'字元,作為該字串的結束符。所以,"hello word"其在記憶體中的儲存形式為:
最後有乙個我們看不見的'\0'。明白了字串的結尾方式,那麼如何計算字串的長度呢?比如:
例題1:
char str1="12345678";
char str2=;
char str3=;
sizeof(str1)=?
sizeof(str2)=?
sizeof(str3)=?
strlen(str1)=?
strlen(str2)=?
strlen(str3)=?
分析:str1是乙個字元陣列,由字串"12345678"進行初始化。由於"12345678"含有乙個結尾字元'\0',所以str1陣列共有9個字元。 因此sizeof(str1)=9。str2也是乙個字元陣列,它的長度由'1','2','3','4','5','6','7','8'8個字元初始化,並沒有指明零字元。 因此sizeof(str2)=8。str3同樣由8個字元初始化,因此sizeof(str3)=8。
strlen函式只計算字串中不含零的字元個數。因此:strlen(str1)=8。而由於str2中最後乙個字元不包含零,所以,str2不是乙個有效的字串, 因此strlen(str2)不確定。而對於字元陣列str3,在第4個字元為'\0',所以作為乙個字串,在此處結尾。所以strlen(str3)=3。
答案:sizeof(str1)=9
sizeof(str2)=8
sizeof(str3)=8
strlen(str1)=8
strlen(str2)=無結束字元0,所以字串溢位,不確定
strlen(str3)=3
例題2:實現strlen方法。
分析:既然字串是以'\0'結尾的,那麼實現strlen也就很簡單了,直接從左往右遍歷字串,遇到'\0'就退出。
size_t strlen (const char * str)
那麼,有沒有不是以零結尾的字串表示方法呢?實際上是有的。比如:unicode_string,ansi_string。這兩種型別的字串表示方法, 就不是以零結尾的了,而是以首位址和有效長度來定義字串。
思考題1:改寫strlen函式,只用一句話,不用任何臨時變數,計算字串字元個數。
2:在windows系統登錄檔中,有一類登錄檔鍵裡存放的是多字串。所謂多字串的定義為:
str1str2str3...strn'\0'組成,其中str1,str2,...strn都是以'\0'結尾的字串,最後再加乙個'\0'結尾組成。 設計乙個演算法,遍歷並列印乙個多字串buffer中的每乙個字串。
字串長度
當字元全是英文本元的時候,兩者是一樣。這裡主要比較一下,中英文混排的時候,兩個計算結果。測試時編碼方式是utf8 複製 如下 str 中文a字1符 echo strlen str echo echo mb strlen str,utf8 輸出結果 14 6 結果分析 在strlen計算時,對待乙個u...
字串長度
碰到第乙個字串結束符 0 時返回計數器值,即 是指實際字串或字元陣列的實際長度 不是所佔空間的位元組數 includeusing namespace std int main char a 32 cin a cin會在寫入結束後加入乙個 0字元 如果輸入了32個字元則會越界 cout strlen ...
字串長度
在右側我們給出了乙個已經基本完成的程式,讀入了乙個字串,呼叫了乙個叫 str len 的函式來計算這個字串的長度,並輸出。聰明的你應該已經發現了,這個叫 str len 的函式並沒有完成,在不修改函式原型的情況下,請完成 str len 函式,實現我們上述的功能吧。1 2 3 4 5 6 7 8 9...