首頁 > 軟體

C++中獲取字串長度的函數sizeof()、strlen()、length()、size()詳解和區別(推薦)

2023-09-06 06:23:53

在C++中計算長度的函數有四種,它們分別是sizeof() ,size(),strlen(),str.length()

一.sizeof()和strlen()兩者區別:

1)sizeof操作符的結果型別是size_t,該型別保證能容納實現所建立的最大物件的位元組大小。 
2)sizeof是運運算元,strlen是函數。 
3)sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以''''結尾的。 
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是陣列,計算到''位置,因此是(10+1)
sizeof(*ss)為1,*ss是第一個字元

3)char ss[100] = "0123456789";
sizeof(ss)為100,ss表示在記憶體中預分配的大小,100*1
strlen(ss)為10,它的內部實現用一個迴圈計算字串的長度,直到''為止。

4)int ss[100] = "0123456789";
sizeof(ss)為400,ss表示在記憶體中預分配的大小,100*4
strlen(ss)錯誤,strlen引數只能是char*,且必須是以''結尾

5)char[] a={'a','b','c'};
sizeof(a)的值應該為3。
char[] b={"abc"};
sizeof(b)的值應該是4。

6)若string str={'a','b','c','','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所作的是一個計數器的工作,它從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃描,直到碰到第一個字串結束符’’為止,然後返回計數器值(長度不包含’’)

返回值

給定字串(不包括“”)長度

注意事項

char型陣列未初始化的情況下,用strlen是不可行的,因為strlen的唯一標準是找‘’,記住這個就能明確strlen會執行處什麼值,如下:

char *a; 	 
	char b[5]; 	
	strlen(a) 
	strlen(b)

結果無固定值,因為strlen判斷的唯一標準是’’,它會根據a和b的指標看是一直向後找,知道碰到’’,無論是不是自己字串的結束標誌’’

二、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個字元,字串以 ‘’ 結尾。所以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*)。當陣列名作為引數傳入時,實際上陣列就退化成指標了。它的功能是:返回字串的長度。該字串可能是自己定義的,也可能是記憶體中隨機的,該函數實際完成的功能是從代表該字串的第一個地址開始遍歷,直到遇到結束符’’。返回的長度大小不包括’’
  • strlen(char*)函數求的是字串的實際長度,它求得方法是從開始到遇到第一個’’,如果你只定義沒有給它賦初值,這個結果是不定的,它會從aa首地址一直找下去,直到遇到’’停止。

二、sizeof()、strlen()兩者區別:

1、sizeof是運運算元,strlen是函數

2、sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以’’’'結尾的

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()內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com