sizeof與strlen是有著本質(zhì)的區(qū)別,sizeof是求數(shù)據(jù)類(lèi)型所占的空間大小,而strlen是求字符串的長(zhǎng)度,字符串以/0結(jié)尾。總的來(lái)說(shuō)sizeof把'\0'也給數(shù)上了,而strlen遇到'\0'就停止計(jì)數(shù)了。
區(qū)別如下:
(1) sizeof是一個(gè)C語(yǔ)言中的一個(gè)單目運(yùn)算符,而strlen是一個(gè)函數(shù),用來(lái)計(jì)算字符串的長(zhǎng)度。
(2)sizeof求的是數(shù)據(jù)類(lèi)型所占空間的大小,而strlen是求字符串的長(zhǎng)度
實(shí)例1:
printf("char=%d/n",sizeof(char)); //1
printf("char=%d/n",sizeof(char)); //4
printf("int=%d/n",sizeof(int)); //4
printf("int=%d/n",sizeof(int)); //4
printf("long=%d/n",sizeof(long)); //4
printf("long=%d/n",sizeof(long)); //4
printf("double=%d/n",sizeof(double)); //8
printf("double=%d/n",sizeof(double)); //4
可以看到,char占1個(gè)字節(jié),int占4個(gè)字節(jié),long點(diǎn)4個(gè)字節(jié),而double占8個(gè)字節(jié)。但 char,int,long,double都占4個(gè)字節(jié)的空間。
這是為什么呢?
在C語(yǔ)言中,char,int,long,double這些基本數(shù)據(jù)類(lèi)型的長(zhǎng)度是由編譯器本身決定的。而char,int,long,double這些都是指針,回想一下,指針就是地址呀,所以里面放的都是地址,而地址的長(zhǎng)度當(dāng)前是由地址總線(xiàn)的位數(shù)決定的,現(xiàn)在的計(jì)算機(jī)一般都是32位的地址總線(xiàn),也就占4個(gè)字節(jié)。
實(shí)例2:
char a[]="hello";
char b[]={'h','e','l','l','o'};
strlen(a),strlen(b)的值分別是多少?
前面分析過(guò),strlen是求字符串的長(zhǎng)度,字符串有個(gè)默認(rèn)的結(jié)束符/0,這個(gè)結(jié)束符是在定義字符串的時(shí)候系統(tǒng)自動(dòng)加上去的,就像定義數(shù)組a一樣。數(shù)組a定義了一個(gè)字符串,數(shù)組b定義了一個(gè)字符數(shù)組。因此,strlen(a)=5,而strlen(b)的長(zhǎng)度就不確定的,因?yàn)閟trlen找不到結(jié)束符,它的結(jié)果會(huì)給一個(gè)隨機(jī)值。
下面是一個(gè)比較經(jīng)典的例子,分析一下:
char *c="abcdef";
char d[]="abcdef";
char e[]={'a','b','c','d','e','f'};
printf("%d%d/n",sizeof(c),strlen(c)); ==>4 6 這里的4是char*c占的空間
printf("%d%d/n",sizeof(d),strlen(d)); ==>7 6 這里的7是因?yàn)?sizeof把'\0'也給數(shù)了
printf("%d%d/n",sizeof(e),strlen(e)); ==>6 14 因?yàn)闆](méi)有遇到'\0',strlen根本沒(méi)停下
分析一下:
第一行定義c為一個(gè)字符指針變量,指向常量字符串,c里面存放的是字符串的首地址。
第二行定義d為一個(gè)字符數(shù)組,以字符串的形式給這個(gè)字符數(shù)組賦值。
第三行定義的也是個(gè)字符數(shù)組,以單個(gè)元素的形式賦值。
當(dāng)以字符串賦值時(shí),"abcdef",結(jié)尾自動(dòng)加一個(gè)"/0".
strlen(c)遇到/0就會(huì)結(jié)束,求的是字符串的長(zhǎng)度,為6.
sizeof(c)求的是類(lèi)型空間大小,在前面說(shuō)過(guò),指針型所點(diǎn)的空間大小是4個(gè)字節(jié),系統(tǒng)地址總線(xiàn)長(zhǎng)度為32位時(shí)。
strlen(d)也是一樣,字符串賦值,自動(dòng)添加/0,求字符串的長(zhǎng)度當(dāng)然是6.
sizeof(d)是求這個(gè)數(shù)組所占空間的大小,即數(shù)組所占內(nèi)存空間的字節(jié)數(shù),應(yīng)該為7.
sizeof(e), 數(shù)組e以單個(gè)元素賦值,沒(méi)有/0結(jié)束符,所以所占空間的大小為6個(gè)字節(jié)。
strlen(e),去找/0結(jié)尾的字符串的長(zhǎng)度,由于找不到/0,所以返回的值是一個(gè)不確定的值。
插一個(gè)我寫(xiě)的程序
逆置一個(gè)字符串
非遞歸
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void reverse_string(char*str, int len)
{
int left = 0;
int right = len;
char tmp = 0;
while (left <= right)
{
tmp= str[left];
str[left] =str[right];
str[right]=tmp;
left++;
right--;
}
}
int main()
{
char str[] = "abcdef";
int len = sizeof(str) / sizeof(str[0]) - 2;
//這里本來(lái)想著是減一,結(jié)果老是運(yùn)行不出來(lái),因?yàn)閟izeof(str) 它的結(jié)果是7,而不是6
reverse_string(str, len);
printf("%s\n", str);
system("pause");
return 0;
}
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站欄目:C語(yǔ)言中sizeof與strlen的區(qū)別-創(chuàng)新互聯(lián)
文章位置:http://jinyejixie.com/article30/ddedpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站策劃、響應(yīng)式網(wǎng)站、網(wǎng)站營(yíng)銷(xiāo)、外貿(mào)網(wǎng)站建設(shè)、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容