關於C語言strlen與sizeof區別詳情
strlen
是一個函數,它用來計算指定字符串 str
的長度,但不包括結束字符(即 null
字符)。strlen
所作的僅僅是一個計數器的工作,它從內存的某個位置(可以是字符串開頭,中間某個位置,甚至是某個不確定的內存區域)開始掃描,直到碰到第一個字符串結束符’\0’為止,然後返回計數器值(長度不包含’\0′)
一.sizeof詳解
1.sizeof()作用
計算變量/類型所占內存大小,單位是字節
int b =sizeof(a); //a為int類型,大小為4個字節 int c = sizeof(int); //4
2.sizeof
sizeof是操作符,不是函數!!!
sizeof
變量 或者sizeof
(變量)都可以sizeof
(類型)可以sizeof
類型是錯誤的
int main() { int a, b, c, d; a = sizeof(a); b = sizeof a; c = sizeof(int); //d = sizeof int; //err printf("%d %d %d\n", a, b, c); // 4 4 4 return 0; }
3.sizeof ()
sizeof ()
內部的表達式不參與真實運算!這點很重要!其運算值在編譯時就計算好瞭
int main() { int a = 10; int b = sizeof(a = a + 1); printf("%d %d \n", a, b); // 10 4 return 0; }
sizeof
內部即使寫的是賦值表達式也不會去真實的運算,sizeof
在計算的時候隻看操作數的類型,不會訪問對應的空間
4.sizeof()與數組名的關系
sizeof(數組名):此時的數組名代表的是整個數組
**&數組名:此時的數組名代表的也是整個數組**
其他情況,數組名代表的是首元素地址
int arr[10]; a = sizeof(arr); //計算的是整個數組的大小 4*10 = 10 b = sizeof(&arr); //取出整個數組的地址,是地址(指針),4/8
5.sizeof()返回類型造成的坑
int i ; //全局變量未初始化系統默認為0 int main() { i--; //i變成-1 if(i > sizeof(i)) { printf(">\n"); } else { printf("<\n"); } return 0; }
打印結果: >
註意:sizeof(i)
和i比較時,sizeof
返回類型為size_t
而i
的類型為int
,最終是用size_t
比較,對於-1
的補碼為:全1
序列,如果看成是無符號數的話,對於的值比sizeof(i) = 4
大
二.strlen詳解
strlen():求字符串長度的庫函數,遇到\0
即停止計算。需要引用 #include<string.h>
頭文件,註意返回類型為:size_t
(unsigned int 無符號整型),
函數原型:
strlen()的模擬實現:
方法1:計數器
size_t my_strlen(const char* str) { size_t count = 0; while (*str != '\0') { count++; str++; } return count; }
方法2:遞歸
size_t my_strlen3(const char* str) { //如果不是\0就+1(本身指向字符),然後遞歸下一個字符 if (*str != '\0') return 1 + my_strlen3(str + 1); //遇到\0即返回0 else return 0; }
方法3:指針-指針
指針-指針得到的是二者之間元素的個數。所以隻要一個指針指向字符串首字符,一個指針指向\0,二者相減就是字符串長度
size_t my_strlen2(const char* str) { char* start = str; char* end = str; while (*end != '\0') { end++; } return end - start; }
strlen()
返回參數size_t
造成的坑點
int main() { char* p1 = "abcd"; char* p2 = "abcde"; if (strlen(p1) - strlen(p2)>0) { printf("p1>p2"); } else { printf("p1<p2"); } return 0; }
上述代碼打印結果:p1>p2
strlen(p1)
結果為4
strlen(p2):
結果為5
二者的類型都為size_t
無符號整形
二者相減得到-1,也被認為是無符號整形,對應的值>0
三.strlen與sizeof的區別
共同點:返回類型都是size_t
不同點:sizeof()
是操作符計算的是變量/類型所占空間的大小,單位是字節,\0也算進空間
strlen()
是庫函數,計算的是字符串長度,不計算\0
int main() { char arr1[] = { 'a','b','c' }; int ret1 = strlen(arr1); int ret2 = sizeof(arr1); printf("%d %d\n", ret1,ret2); //隨機值 3 //arr1並沒放入\0,strlen()向後直到找到\0才停止,所以是隨機值 而arr1本身數組元素個數為3,根據後面初始化的內容確定瞭數組的大小,sizeof:3*1 = 3 char arr[] = "abcdef"; int ret3 = strlen(arr); int ret4 = sizeof(arr); printf("%d %d\n", ret3, ret4); //6 7 //arr大小為7,含\0 strlen不算\0 return 0; }
到此這篇關於關於C語言strlen
與sizeof
區別詳情的文章就介紹到這瞭,更多相關C語言strlen
與sizeof
區別內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C++中獲取字符串長度的函數sizeof()、strlen()、length()、size()詳解和區別(推薦)
- strlen函數的使用與模擬實現strlen的方法
- C語言多種獲取字符串長度的方法
- 一篇文章帶你入門C語言:函數
- C語言字符串旋轉問題的深入講解