C++中獲取字符串長(zhǎng)度的函數(shù)sizeof()、strlen()、length()、size()詳解和區(qū)別(推薦)
在C++中計(jì)算長(zhǎng)度的函數(shù)有四種,它們分別是sizeof() ,size(),strlen(),str.length()。
一.sizeof()和strlen()兩者區(qū)別:
1)sizeof操作符的結(jié)果類(lèi)型是size_t,該類(lèi)型保證能容納實(shí)現(xiàn)所建立的最大對(duì)象的字節(jié)大小。
2)sizeof是運(yùn)算符,strlen是函數(shù)。
3)sizeof可以用類(lèi)型做參數(shù),strlen只能用char*做參數(shù),且必須是以''\0''結(jié)尾的。
4)sizeof在編譯時(shí)期就計(jì)算出來(lái),strlen在運(yùn)行之后才能計(jì)算出來(lái)。
5)strlen計(jì)算字符串的具體長(zhǎng)度(只能是字符串),不包括字符串結(jié)束符。返回的是字符個(gè)數(shù)。sizeof計(jì)算聲明后所占的內(nèi)存數(shù)(字節(jié)大?。?,不是實(shí)際長(zhǎng)度。
舉例:
1)char* ss = "0123456789";
sizeof(ss)為4,ss是指向字符串常量的字符指針,sizeof 獲得的是指針?biāo)嫉目臻g,則為4
sizeof(*ss)為1,*ss是第一個(gè)char字符,則為1
2)char ss[] = "0123456789";
sizeof(ss)為11,ss是數(shù)組,計(jì)算到'\0'位置,因此是(10+1)
sizeof(*ss)為1,*ss是第一個(gè)字符
3)char ss[100] = "0123456789";
sizeof(ss)為100,ss表示在內(nèi)存中預(yù)分配的大小,100*1
strlen(ss)為10,它的內(nèi)部實(shí)現(xiàn)用一個(gè)循環(huán)計(jì)算字符串的長(zhǎng)度,直到'\0'為止。
4)int ss[100] = "0123456789";
sizeof(ss)為400,ss表示在內(nèi)存中預(yù)分配的大小,100*4
strlen(ss)錯(cuò)誤,strlen參數(shù)只能是char*,且必須是以'\0'結(jié)尾
5)char[] a={'a','b','c'};
sizeof(a)的值應(yīng)該為3。
char[] b={"abc"};
sizeof(b)的值應(yīng)該是4。
6)若string str={'a','b','c','\0','X'};
那么sizeof(str)為5,strlen(str)為3。
二.string中的length()和size()
c++中,在獲取字符串長(zhǎng)度時(shí),size()函數(shù)與length()函數(shù)作用相同。
例如:string str = “wang”
則,str.length() = 4。
除此之外,size()函數(shù)還可以獲取vector類(lèi)型的長(zhǎng)度。
例如:vector < int> num(15,2)
則,num.size() = 15。
參考資料:
https://blog.csdn.net/z_qifa/article/details/77744482
補(bǔ)充:strlen、length、size、sizeof的用法與區(qū)別
各函數(shù)用法
一、strlen
頭文件
string.h
語(yǔ)法形式:
size_t strlen( const char* str);
該函數(shù)的默認(rèn)使用類(lèi)型是char * 也就是一個(gè)char指針類(lèi)型,所以在判斷過(guò)程中是根據(jù)指針往后找,對(duì)于 char p[]或者char *p是可以直接使用的
但是對(duì)于直接的string類(lèi)型,例如:string a=“abc” 這種需要需要用c_str()將C++ string轉(zhuǎn)換為char*類(lèi)型: strlen(a.c_str());
函數(shù)定義
strlen所作的是一個(gè)計(jì)數(shù)器的工作,它從內(nèi)存的某個(gè)位置(可以是字符串開(kāi)頭,中間某個(gè)位置,甚至是某個(gè)不確定的內(nèi)存區(qū)域)開(kāi)始掃描,直到碰到第一個(gè)字符串結(jié)束符’\0’為止,然后返回計(jì)數(shù)器值(長(zhǎng)度不包含’\0’)
返回值
給定字符串(不包括“\0”)長(zhǎng)度
注意事項(xiàng)
char型數(shù)組未初始化的情況下,用strlen是不可行的,因?yàn)閟trlen的唯一標(biāo)準(zhǔn)是找‘\0’,記住這個(gè)就能明確strlen會(huì)執(zhí)行處什么值,如下:
char *a; char b[5]; strlen(a) strlen(b)
結(jié)果無(wú)固定值,因?yàn)閟trlen判斷的唯一標(biāo)準(zhǔn)是’\0’,它會(huì)根據(jù)a和b的指針看是一直向后找,知道碰到’\0’,無(wú)論是不是自己字符串的結(jié)束標(biāo)志’\0’
二、length/size
頭文件
兩者在c++中在iostream庫(kù)
函數(shù)原型
在c++標(biāo)準(zhǔn)庫(kù)中,兩者的定義如下:
size_type __CLR_OR_THIS_CALL length() const { //return length of sequence return (_Mysize ); }
size_type __CLR_OR_THIS_CALL size() const { // return length of sequence return (_Mysize); }
所以兩者沒(méi)有區(qū)別
語(yǔ)法形式
string a; a.length(); a.size();
三、sizeof
頭文件
不需要包含頭文件
函數(shù)定義
在 C 語(yǔ)言中,sizeof() 是一個(gè)判斷數(shù)據(jù)類(lèi)型或者表達(dá)式長(zhǎng)度的運(yùn)算符,對(duì)sizeof() 的處理是在編譯階段進(jìn)行
語(yǔ)法形式
sizeof有兩種語(yǔ)法形式,如下:
sizeof(type_name);//sizeof(類(lèi)型); sizeof object;//sizeof對(duì)象;
所以可以這樣表示:
int i; sizeof(i);//ok sizeof i;//ok sizeof(int);//ok sizeof int;//erro
sizeof計(jì)算對(duì)象的大小也是轉(zhuǎn)換成對(duì)對(duì)象類(lèi)型的計(jì)算,也就是說(shuō),同種類(lèi)型的不同對(duì)象其sizeof值都是一致的。sizeof對(duì)一個(gè)表達(dá)式求值,編譯器根據(jù)表達(dá)式的最終結(jié)果類(lèi)型來(lái)確定大小,一般不會(huì)對(duì)表達(dá)式進(jìn)行計(jì)算,如:
sizeof(2);//2的類(lèi)型為int,所以等價(jià)于sizeof(int); sizeof(2+3.14);//3.14的類(lèi)型為double,2也會(huì)被提升成double類(lèi)型,所以等價(jià)于sizeof(double);
sizeof也可以對(duì)一個(gè)函數(shù)調(diào)用求值,其結(jié)果是函數(shù)返回類(lèi)型的大小,函數(shù)并不會(huì)被調(diào)用,我們來(lái)看一個(gè)完整的例子:
char foo() { return 'a'; } int main() { size_t a=sizeof(foo()); //foo()的返回值類(lèi)型為char,所以sz=sizeof(char),foo()并不會(huì)被調(diào)用 }
指針變量的sizeof
指針記錄了另一個(gè)對(duì)象的地址。在32位計(jì)算機(jī)中,一個(gè)指針變量的返回值通常是4(注意結(jié)果是以字節(jié)為單位),在64位系統(tǒng)中指針變量的sizeof通常為8
通常情況下,sizeof對(duì)同一個(gè)字符數(shù)組求大小可能會(huì)存在兩種可能
str是字符數(shù)組且初始化
char str[] = "hello"
str由字符串"hello"初始化,“hello”; 共5個(gè)字符,字符串以 ‘\0’ 結(jié)尾。所以str數(shù)組的長(zhǎng)度是6
str是字符數(shù)組且未初始化
int a2[3]; sizeof( a1 );
結(jié)果為3*4=12(依賴于int)
str為指針形式
char * str; sizeof(str)
sizeof(str)為4 X86平臺(tái)
sizeof(str)為8 X64平臺(tái)
區(qū)別
一、sizeof()、strlen()兩者區(qū)別:
1、sizeof():返回所占總空間的字節(jié)數(shù)
(1)針對(duì)整型或字符型數(shù)組
(2)針對(duì)整型或字符型指針
2、strlen():返回字符數(shù)組或字符串所占的字節(jié)數(shù)
(1)針對(duì)字符數(shù)組
(2)針對(duì)字符指針
- sizeof(…)是運(yùn)算符,其值在編譯時(shí)即計(jì)算好了,參數(shù)可以是數(shù)組、指針、類(lèi)型、對(duì)象、函數(shù)等。它的功能是:獲得保證能容納實(shí)現(xiàn)所建立的最大對(duì)象的字節(jié)大小。由于在編譯時(shí)計(jì)算,因此sizeof不能用來(lái)返回動(dòng)態(tài)分配的內(nèi)存空間的大小
- strlen(…)是函數(shù),要在運(yùn)行時(shí)才能計(jì)算。參數(shù)必須是字符型指針(char*)。當(dāng)數(shù)組名作為參數(shù)傳入時(shí),實(shí)際上數(shù)組就退化成指針了。它的功能是:返回字符串的長(zhǎng)度。該字符串可能是自己定義的,也可能是內(nèi)存中隨機(jī)的,該函數(shù)實(shí)際完成的功能是從代表該字符串的第一個(gè)地址開(kāi)始遍歷,直到遇到結(jié)束符’\0’。返回的長(zhǎng)度大小不包括’\0’
- strlen(char*)函數(shù)求的是字符串的實(shí)際長(zhǎng)度,它求得方法是從開(kāi)始到遇到第一個(gè)’\0’,如果你只定義沒(méi)有給它賦初值,這個(gè)結(jié)果是不定的,它會(huì)從aa首地址一直找下去,直到遇到’\0’停止。
二、sizeof()、strlen()兩者區(qū)別:
1、sizeof是運(yùn)算符,strlen是函數(shù)
2、sizeof可以用類(lèi)型做參數(shù),strlen只能用char*做參數(shù),且必須是以’’\0’'結(jié)尾的
3、大部分編譯程序 在編譯的時(shí)候就把sizeof計(jì)算過(guò)了 是類(lèi)型或是變量的長(zhǎng)度。
char str[20]="0123456789"; int a=strlen(str); //a=10; int b=sizeof(str); //而b=20;
4、strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來(lái),用來(lái)計(jì)算字符串的長(zhǎng)度,不是類(lèi)型占內(nèi)存的大小
5、sizeof后如果是類(lèi)型必須加括弧,如果是變量名可以不加括弧。這是因?yàn)閟izeof是個(gè)操作符不是個(gè)函數(shù)
三、length()和size()兩者區(qū)別:
c++中的size()和length()沒(méi)有區(qū)別
展示
#include<iostream> #include<cstring> using namespace std; int main(){ char str[] = "abcd"; char *arr = "abcd"; string a="abcd"; cout<<" str"<<" a"<<" arr"<<endl; cout<<"strlen "<<strlen(str)<<" "<<strlen(a.c_str())<<" "<<strlen(arr)<<endl; cout<<"length "<<" "<<a.length()<<endl; cout<<"size "<<" "<<a.size()<<endl; cout<<"sizeof "<<sizeof(str)<<" "<<sizeof(a)<<" "<<sizeof(arr)<<endl; }
若空著則表示無(wú)法用該函數(shù)求出長(zhǎng)度
到此這篇關(guān)于C++中獲取字符串長(zhǎng)度的函數(shù)sizeof()、strlen()、length()、size()詳解和區(qū)別的文章就介紹到這了,更多相關(guān)獲取字符串長(zhǎng)度的函數(shù)sizeof()、strlen()、length()、size()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt利用QPainter實(shí)現(xiàn)基本繪圖的示例詳解
Qt?中提供了強(qiáng)大的?2D?繪圖系統(tǒng),可以使用相同的?API?在屏幕和繪圖設(shè)備上進(jìn)行繪制,它主要基于QPainter、QPaintDevice?和?QPaintEngine?這三個(gè)類(lèi)。本文主要和大家介紹一下QPainter實(shí)現(xiàn)的基本繪圖,感興趣的可以了解一下2022-12-12Opencv Hough算法實(shí)現(xiàn)圖片中直線檢測(cè)
這篇文章主要為大家詳細(xì)介紹了Opencv Hough算法實(shí)現(xiàn)圖片中直線檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12C++實(shí)現(xiàn)圖的鄰接矩陣存儲(chǔ)和廣度、深度優(yōu)先遍歷實(shí)例分析
這篇文章主要介紹了C++實(shí)現(xiàn)圖的鄰接矩陣存儲(chǔ)和廣度、深度優(yōu)先遍歷,實(shí)例分析了C++實(shí)現(xiàn)圖的遍歷技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04C語(yǔ)言實(shí)現(xiàn)常見(jiàn)進(jìn)制轉(zhuǎn)換的示例代碼
生活中最常見(jiàn)的進(jìn)制是十進(jìn)制,而有一類(lèi)編程題會(huì)要求將十進(jìn)制轉(zhuǎn)換為其他進(jìn)制,本文將主要講述C語(yǔ)言中常見(jiàn)的幾類(lèi)進(jìn)制轉(zhuǎn)換問(wèn)題,希望對(duì)大家有所幫助2023-04-04C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之單鏈表的查找和建立
鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將和大家一起聊聊C語(yǔ)言中單鏈表的查找和建立,感興趣的可以學(xué)習(xí)一下2022-09-09C語(yǔ)言實(shí)現(xiàn)時(shí)區(qū)轉(zhuǎn)換函數(shù)的實(shí)例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)時(shí)區(qū)轉(zhuǎn)換函數(shù)的實(shí)例的相關(guān)資料,這里分析需求并提供實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-08-08