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!

推薦閱讀: