C++中獲取字符串長度的函數sizeof()、strlen()、length()、size()詳解和區別(推薦)
在C++中計算長度的函數有四種,它們分別是sizeof() ,size(),strlen(),str.length()。
一.sizeof()和strlen()兩者區別:
1)sizeof操作符的結果類型是size_t,該類型保證能容納實現所建立的最大對象的字節大小。
2)sizeof是運算符,strlen是函數。
3)sizeof可以用類型做參數,strlen隻能用char*做參數,且必須是以''\0''結尾的。
4)sizeof在編譯時期就計算出來,strlen在運行之後才能計算出來。
5)strlen計算字符串的具體長度(隻能是字符串),不包括字符串結束符。返回的是字符個數。sizeof計算聲明後所占的內存數(字節大小),不是實際長度。
舉例:
1)char* ss = "0123456789";
sizeof(ss)為4,ss是指向字符串常量的字符指針,sizeof 獲得的是指針所占的空間,則為4
sizeof(*ss)為1,*ss是第一個char字符,則為1
2)char ss[] = "0123456789";
sizeof(ss)為11,ss是數組,計算到'\0'位置,因此是(10+1)
sizeof(*ss)為1,*ss是第一個字符
3)char ss[100] = "0123456789";
sizeof(ss)為100,ss表示在內存中預分配的大小,100*1
strlen(ss)為10,它的內部實現用一個循環計算字符串的長度,直到'\0'為止。
4)int ss[100] = "0123456789";
sizeof(ss)為400,ss表示在內存中預分配的大小,100*4
strlen(ss)錯誤,strlen參數隻能是char*,且必須是以'\0'結尾
5)char[] a={'a','b','c'};
sizeof(a)的值應該為3。
char[] b={"abc"};
sizeof(b)的值應該是4。
6)若string str={'a','b','c','\0','X'};
那麼sizeof(str)為5,strlen(str)為3。
二.string中的length()和size()
c++中,在獲取字符串長度時,size()函數與length()函數作用相同。
例如:string str = “wang”
則,str.length() = 4。
除此之外,size()函數還可以獲取vector類型的長度。
例如:vector < int> num(15,2)
則,num.size() = 15。
參考資料:
https://blog.csdn.net/z_qifa/article/details/77744482
補充:strlen、length、size、sizeof的用法與區別
各函數用法
一、strlen
頭文件
string.h
語法形式:
size_t strlen( const char* str);
該函數的默認使用類型是char * 也就是一個char指針類型,所以在判斷過程中是根據指針往後找,對於 char p[]或者char *p是可以直接使用的
但是對於直接的string類型,例如:string a=“abc” 這種需要需要用c_str()將C++ string轉換為char*類型: strlen(a.c_str());
函數定義
strlen所作的是一個計數器的工作,它從內存的某個位置(可以是字符串開頭,中間某個位置,甚至是某個不確定的內存區域)開始掃描,直到碰到第一個字符串結束符’\0’為止,然後返回計數器值(長度不包含’\0’)
返回值
給定字符串(不包括“\0”)長度
註意事項
char型數組未初始化的情況下,用strlen是不可行的,因為strlen的唯一標準是找‘\0’,記住這個就能明確strlen會執行處什麼值,如下:
char *a; char b[5]; strlen(a) strlen(b)
結果無固定值,因為strlen判斷的唯一標準是’\0’,它會根據a和b的指針看是一直向後找,知道碰到’\0’,無論是不是自己字符串的結束標志’\0’
二、length/size
頭文件
兩者在c++中在iostream庫
函數原型
在c++標準庫中,兩者的定義如下:
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); }
所以兩者沒有區別
語法形式
string a; a.length(); a.size();
三、sizeof
頭文件
不需要包含頭文件
函數定義
在 C 語言中,sizeof() 是一個判斷數據類型或者表達式長度的運算符,對sizeof() 的處理是在編譯階段進行
語法形式
sizeof有兩種語法形式,如下:
sizeof(type_name);//sizeof(類型); sizeof object;//sizeof對象;
所以可以這樣表示:
int i; sizeof(i);//ok sizeof i;//ok sizeof(int);//ok sizeof int;//erro
sizeof計算對象的大小也是轉換成對對象類型的計算,也就是說,同種類型的不同對象其sizeof值都是一致的。sizeof對一個表達式求值,編譯器根據表達式的最終結果類型來確定大小,一般不會對表達式進行計算,如:
sizeof(2);//2的類型為int,所以等價於sizeof(int); sizeof(2+3.14);//3.14的類型為double,2也會被提升成double類型,所以等價於sizeof(double);
sizeof也可以對一個函數調用求值,其結果是函數返回類型的大小,函數並不會被調用,我們來看一個完整的例子:
char foo() { return 'a'; } int main() { size_t a=sizeof(foo()); //foo()的返回值類型為char,所以sz=sizeof(char),foo()並不會被調用 }
指針變量的sizeof
指針記錄瞭另一個對象的地址。在32位計算機中,一個指針變量的返回值通常是4(註意結果是以字節為單位),在64位系統中指針變量的sizeof通常為8
通常情況下,sizeof對同一個字符數組求大小可能會存在兩種可能
str是字符數組且初始化
char str[] = "hello"
str由字符串"hello"初始化,“hello”; 共5個字符,字符串以 ‘\0’ 結尾。所以str數組的長度是6
str是字符數組且未初始化
int a2[3]; sizeof( a1 );
結果為3*4=12(依賴於int)
str為指針形式
char * str; sizeof(str)
sizeof(str)為4 X86平臺
sizeof(str)為8 X64平臺
區別
一、sizeof()、strlen()兩者區別:
1、sizeof():返回所占總空間的字節數
(1)針對整型或字符型數組
(2)針對整型或字符型指針
2、strlen():返回字符數組或字符串所占的字節數
(1)針對字符數組
(2)針對字符指針
- sizeof(…)是運算符,其值在編譯時即計算好瞭,參數可以是數組、指針、類型、對象、函數等。它的功能是:獲得保證能容納實現所建立的最大對象的字節大小。由於在編譯時計算,因此sizeof不能用來返回動態分配的內存空間的大小
- strlen(…)是函數,要在運行時才能計算。參數必須是字符型指針(char*)。當數組名作為參數傳入時,實際上數組就退化成指針瞭。它的功能是:返回字符串的長度。該字符串可能是自己定義的,也可能是內存中隨機的,該函數實際完成的功能是從代表該字符串的第一個地址開始遍歷,直到遇到結束符’\0’。返回的長度大小不包括’\0’
- strlen(char*)函數求的是字符串的實際長度,它求得方法是從開始到遇到第一個’\0’,如果你隻定義沒有給它賦初值,這個結果是不定的,它會從aa首地址一直找下去,直到遇到’\0’停止。
二、sizeof()、strlen()兩者區別:
1、sizeof是運算符,strlen是函數
2、sizeof可以用類型做參數,strlen隻能用char*做參數,且必須是以’’\0’'結尾的
3、大部分編譯程序 在編譯的時候就把sizeof計算過瞭 是類型或是變量的長度。
char str[20]="0123456789"; int a=strlen(str); //a=10; int b=sizeof(str); //而b=20;
4、strlen的結果要在運行的時候才能計算出來,用來計算字符串的長度,不是類型占內存的大小
5、sizeof後如果是類型必須加括弧,如果是變量名可以不加括弧。這是因為sizeof是個操作符不是個函數
三、length()和size()兩者區別:
c++中的size()和length()沒有區別
展示
#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; }
若空著則表示無法用該函數求出長度
到此這篇關於C++中獲取字符串長度的函數sizeof()、strlen()、length()、size()詳解和區別的文章就介紹到這瞭,更多相關獲取字符串長度的函數sizeof()、strlen()、length()、size()內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C++中strlen(),sizeof()與size()的區別
- 聊聊c++數組名稱和sizeof的問題
- java string對象上的操作,常見的用法你知道嗎
- C++的指針,引用和STL詳解
- 關於C語言strlen與sizeof區別詳情