關(guān)于C語言strlen與sizeof區(qū)別詳情

strlen 是一個函數(shù),它用來計算指定字符串 str 的長度,但不包括結(jié)束字符(即 null 字符)。strlen所作的僅僅是一個計數(shù)器的工作,它從內(nèi)存的某個位置(可以是字符串開頭,中間某個位置,甚至是某個不確定的內(nèi)存區(qū)域)開始掃描,直到碰到第一個字符串結(jié)束符'\0'為止,然后返回計數(shù)器值(長度不包含'\0')
一.sizeof詳解
1.sizeof()作用
計算變量/類型所占內(nèi)存大小,單位是字節(jié)
int b =sizeof(a); //a為int類型,大小為4個字節(jié) int c = sizeof(int); //4
2.sizeof
sizeof是操作符,不是函數(shù)?。?!
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 ()內(nèi)部的表達式不參與真實運算!這點很重要!其運算值在編譯時就計算好了
int main()
{
int a = 10;
int b = sizeof(a = a + 1);
printf("%d %d \n", a, b); // 10 4
return 0;
}
sizeof內(nèi)部即使寫的是賦值表達式也不會去真實的運算,sizeof在計算的時候只看操作數(shù)的類型,不會訪問對應(yīng)的空間
4.sizeof()與數(shù)組名的關(guān)系
sizeof(數(shù)組名):此時的數(shù)組名代表的是整個數(shù)組
**&數(shù)組名:此時的數(shù)組名代表的也是整個數(shù)組**
其他情況,數(shù)組名代表的是首元素地址
int arr[10]; a = sizeof(arr); //計算的是整個數(shù)組的大小 4*10 = 10 b = sizeof(&arr); //取出整個數(shù)組的地址,是地址(指針),4/8
5.sizeof()返回類型造成的坑
int i ; //全局變量未初始化系統(tǒng)默認為0
int main()
{
i--; //i變成-1
if(i > sizeof(i))
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
打印結(jié)果: >
注意:sizeof(i)和i比較時,sizeof返回類型為size_t 而i的類型為int,最終是用size_t比較,對于-1的補碼為:全1序列,如果看成是無符號數(shù)的話,對于的值比sizeof(i) = 4大
二.strlen詳解
strlen():求字符串長度的庫函數(shù),遇到\0即停止計算。需要引用 #include<string.h>頭文件,注意返回類型為:size_t(unsigned int 無符號整型),
函數(shù)原型:

strlen()的模擬實現(xiàn):
方法1:計數(shù)器
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:指針-指針
指針-指針得到的是二者之間元素的個數(shù)。所以只要一個指針指向字符串首字符,一個指針指向\0,二者相減就是字符串長度
size_t my_strlen2(const char* str)
{
char* start = str;
char* end = str;
while (*end != '\0')
{
end++;
}
return end - start;
}
strlen()返回參數(shù)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;
}
上述代碼打印結(jié)果:p1>p2
strlen(p1) 結(jié)果為4
strlen(p2):結(jié)果為5 二者的類型都為size_t 無符號整形
二者相減得到-1,也被認為是無符號整形,對應(yīng)的值>0
三.strlen與sizeof的區(qū)別
共同點:返回類型都是size_t
不同點:sizeof()是操作符計算的是變量/類型所占空間的大小,單位是字節(jié),\0也算進空間
strlen()是庫函數(shù),計算的是字符串長度,不計算\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本身數(shù)組元素個數(shù)為3,根據(jù)后面初始化的內(nèi)容確定了數(shù)組的大小,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;
}
到此這篇關(guān)于關(guān)于C語言strlen與sizeof區(qū)別詳情的文章就介紹到這了,更多相關(guān)C語言strlen與sizeof區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ CryptoPP使用AES實現(xiàn)加解密詳解
Crypto++ (CryptoPP) 是一個用于密碼學(xué)和加密的 C++ 庫,提供了大量的密碼學(xué)算法和功能,這篇文章主要為大家介紹了C++ CryptoPP如何使用AES實現(xiàn)加解密,需要的可以參考下2023-11-11
VC++文件監(jiān)控之ReadDirectoryChangesW
文章主要介紹文件監(jiān)控的另一種實現(xiàn)方式,利用ReadDirectoryChangesW來實現(xiàn)文件的監(jiān)控,希望對大家有幫助2019-04-04

