獲取字串長度的幾個常用方法
版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2017.08.30 |
前言
最近一直在寫OC和Swift,已經好幾年沒有寫C的東西了,今天突然被一個人問懵逼了,頓時感覺一身冷汗,真的難道這麼簡單的問題我都記錯了嗎?回到家以後痛定思痛,感覺還是沒事的時候寫一點東西,這樣子才不會慢慢遺忘,下面我們就從最簡單的獲取C字串的長度開始吧。
使用strlen函式
字串的長度可以使用strlen
函式進行計算。
const char *str = "Hello world";
unsigned int length = strlen(str);
printf("length = %d\n", length);
下面看輸出結果
length = 11
Program ended with exit code: 0
這裡要注意:strlen()函式求出的字串長度為有效長度,即不包含字串末尾結束符‘\0’
,因而返回的結果是第一個'\0'前字元元素的個數。
使用sizeof()計算
字串的長度還可以使用sizeof()
進行計算。
有的人可能這麼做
const char *str = "Hello world";
unsigned int length = sizeof(str);
printf("length = %d\n", length);
看輸出結果
length = 8
Program ended with exit code: 0
其實這麼寫是錯誤的,這裡輸出的不是字串的長度,而是指標變數佔有空間的大小。32位作業系統對應4位元組,所以結果是4,64位系統對應8位元組,返回的結果就是8。
接著看下面這個例子
char s1[20] = "hello world";
char s2[20] = {'h','e','l','l','o',' ','w','o','r','l','d','\0'};
char s3[] = "hello\0 world";
char s4[] = {'h','e','l','l','o','\0',' ','w','o','r','l','d','\0'};
printf("%d\t%d\t%d\t%d\n",strlen(s1),strlen(s2),strlen(s3),strlen(s4));
printf("%d\t%d\t%d\t%d\n",sizeof(s1),sizeof(s2),sizeof(s3),sizeof(s4));
下面看輸出結果
11 11 5 5
20 20 13 13
Program ended with exit code: 0
所以,這裡要注意:
- sizeof求得的結果是
儲存該字串的變數佔用的空間大小
,因而一定會包括'\0',若'\0'後還有空餘的空間,也會包含到結果裡面。 - 當在函式內部使用sizeof()求解由函式的形參傳入的字元陣列的長度時,得到的結果為指標的長度,既對應變數的位元組數,而不是字串的長度,此處一定要小心。
- 總結一句就是sizeof計算的是變數的大小,而strlen計算的是字串的長度,前者不受字元'\0'影響,後者以'\0'作為長度判定依據。
- sizeof用來求字串的長度,只在特定情況下可行,即字元陣列剛好被一個字串佔滿。
自定義函式實現
可以自定義函式進行字串長度的計算。
#include <stdio.h>
#include <string.h>
#include <time.h>
int main(int argc, const char * argv[])
{
/**
字串長度的計算
*/
const char *str = "Hello world";
unsigned int length = strLength(str);
printf("length = %d\n", length);
}
int strLength(char *str)
{
int i = 0;
while ( str[i++] != '\0')
;
return i;
}
這裡還要注意:
- 從上面的結果可以看出來,它將中間的空格還有後面的
\0
計算在內了。
後記
今天非常鬱悶,被這個小點給弄錯了,以前寫的C都忘記了,非常鬱悶,所以寫一篇文章以自警,絕不犯錯第二次。
相關文章
- 獲取C/C++字串、字元陣列長度C++字串字元陣列
- C++獲取陣列的長度C++陣列
- JavaScript獲取字串的長度區分漢字JavaScript字串
- Cesium 比較常用的幾個方法
- shell 怎麼獲取引數的長度
- 寫個方法,找出指定字串中重複最多的字元及其長度字串字元
- android獲取控制元件的幾種方法Android控制元件
- 前端常用的echart獲取地圖json方法前端地圖JSON
- Java String類,字串常量池,建立方法,字串的獲取,擷取,轉換,分割。Java字串
- 獲取母字串中某個子字串的某個確定的index值字串Index
- 字串最後一個單詞的長度字串
- 常用的幾個陣列方法與數學方法陣列
- JavaScript陣列 幾個常用方法JavaScript陣列
- MDM獲取UDID的幾個技術點
- PHP如何獲取最大檔名長度PHP
- 根據id獲取元素的寬度的方法
- mssql sqlserver 從指定字串中獲取數字的方法SQLServer字串
- 用 GetLength(int dimension) 獲取陣列指定維度的長度。陣列
- 獲取一個字串中出現最多的字元和他的個數字串字元
- c語言獲取陣列長度的函式C語言陣列函式
- Python字串刪除第一個字元常用的方法!Python字串字元
- 獲得包含中英文字串的自然長度字串
- java字串常用方法Java字串
- 產生10個長度不超過10的字串字串
- 編寫一個程式求輸入字串的長度字串
- Python中查詢字串某個字元最常用的方法!Python字串字元
- bat之獲取指定幾個月前的月份資訊BAT
- Encoding.Default.GetByteCount(),C# 獲取字串位元組長度EncodingC#字串
- Python中獲取執行緒返回值的常用方法!Python執行緒
- JavaScript常用的字串處理方法JavaScript字串
- 字串的常用屬性和方法字串
- 獲取陣列第N個元素的方法陣列
- Python獲取星期幾Python
- String字串的最大長度是多少?字串
- Linux獲取10個你最常用的終端命令列表Linux命令列
- 獲取方法
- 建樹的幾種常用方法
- Spring - 獲取ApplicationContext的幾種方式SpringAPPContext
- 寫一個獲取非行間樣式的方法