字串 字元和位元組

2021-10-22 19:43:25 字數 4483 閱讀 6482

字串是由乙個個字元組成的,每個字元又由乙個或多個位元組來表示,每個位元組又由8個bit位來表示。

字元:計算機中使用的文字和符號,比如1、2、a、b、%等等。

位元組(byte):一種計量單位,表示資料量多少,它是計算機資訊技術用於計量儲存容量的一種計量單位。

不同編碼裡,字元和位元組的對應關係不同:

①ascii碼中,乙個英文本母佔乙個位元組的空間,乙個中文漢字佔兩個位元組的空間。

②utf-8編碼中,乙個英文本元等於乙個位元組,乙個中文等於三個位元組。

③unicode編碼中,乙個英文等於兩個位元組,乙個中文等於兩個位元組。

符號:英文標點佔乙個位元組,中文標點佔兩個位元組。舉例:英文句號「.」佔1個位元組的大小,中文句號「。」佔2個位元組的大小。

④utf-16編碼中,乙個英文本母字元或乙個漢字字元儲存都需要2個位元組(unicode擴充套件區的一些漢字儲存需要4個位元組)。

⑤utf-32編碼中,世界上任何字元的儲存都需要4個位元組。

標頭檔案string.h包含了使用字串函式所需的原型和宣告

字串長度:它所包含的字元個數。nul位元組是字串的終止符,但它本身並不是字串的一部分,所以字串的長度並不包含nul位元組。

庫函式strlen的原型如下:

size_t strlen

(char

const

*string)

;//注意strlen返回乙個型別為size_t的值。這個型別是在標頭檔案stddef.h中定義的,它是乙個無符號整數型別。

在表示式中使用無符號數可能導致不可預料的結果。例如,

if

(strlen

(x)>=

strlen

(y))if(

strlen

(x)-

strlen

(y)>=

0)

以上兩者不等。第一條將按照你預想的那樣工作,但第二條語句的結果將永遠是真。strlen的結果是個無符號數,所以操作符》=左邊的表示式也將是無符號數,而無符號數絕對不可能是負的。

不受限制的字串函式

1.複製字串

用於複製字串的函式是strcpy,它的原型如下:

char

*strcpy

(char

*dst,

char

const

*src)

;

這個函式把引數src字串複製到dst引數。如果引數srcdst在記憶體**現重疊,其結果是未定義的。

由於dst引數將進行修改,因此它必須是個字元陣列,或者是乙個指向動態分配記憶體的陣列的指標,不能使用字串常量

注意:程式設計師必須保證目標字元陣列的空間足以容納需要複製的字串。如果字串比數組長,多餘的字元仍被複製,它們將覆蓋原先儲存與陣列後面的記憶體空間的值。strcpy無法解決這個問題,因為它無法判斷目標字元陣列的長度。

2. 連線字串

把乙個字串新增(連線)到另乙個字串的後面,可以使用strcat函式,原型如下:

char

*strcat

(char

*dst,

char

const

*src)

;

strcat函式要求dst引數原先已經包含了乙個字串(可以是空字串)。找到這個字串的末尾,並把src字串的乙份副本新增到這個位置。如果引數srcdst的位置發生重疊,其結果是未定義的。

strcpystrcat都返回它們第1個引數的乙份副本,就是乙個指向目標字元陣列的指標。由於它們返回這種型別的值,因此可以巢狀地呼叫這些函式。例如:

strcat

(strcpy

(dst,a)

,b);

3. 字串的比較

詞典比較:比較兩個字串涉及對兩個字串對應的字元逐個比較,直到發現不匹配為止。

庫函式strcmp用於比較兩個字串,它的原型如下:

int

*strcmp

(char

const

*s1,

char

const

*s2)

;//如果s1小於s2,則函式返回乙個小於零的值;若大於,則返回乙個大於零的值,否則返回零;

注意:由於strcmp並不修改它的任何乙個引數,因此不存在溢位字元陣列的危險。但是,和其他不受限制的字串函式一樣,strcmp函式的字串引數必須以乙個nul位元組結尾。若並非如此,strcmp就可能對引數後面的位元組進行比較,這個比較結果將不會有什麼意義。

長度受限的字串函式

char

*strcpy

(char

*dst,

char

const

*src)

;char

*strcat

(char

*dst,

char

const

*src)

;int

*strcmp

(char

const

*s1,

char

const

*s2)

;

strcpy一樣,strncpy把源字串的字元複製到目標陣列。然而,它總是正好向dst寫入len個字元。如果strlen(src)的值小於lendst陣列就用額外的nul字元填充到len長度;如果大於或等於len,那麼只有len個字元被複製到dst中。注意,它的結果將不會以nul位元組結尾。

注意:strncpy呼叫的結果可能不是乙個字串,因此字串必須以nul位元組結尾。若在乙個需要字串的地方,使用了不是以nul位元組結尾的字串行,strlen函式將無法知道nul位元組是沒有的,所以它將繼續進行查詢,乙個字元接乙個字元,直到它發現乙個nul位元組為止。

字串查詢

查詢乙個字元

char

*strchr

(char

const

*str,

int ch)

;char

*strrchr

(char

const

*str,

int ch)

;

第2個引數是乙個整型值。但是,它包含了乙個字元值。在字串str中查詢字元ch第1次出現的位置,找到後函式返回乙個指向該位置的指標。如果該字元並不存在於字串中,函式就返回乙個null指標。兩個函式功能基本一致。第2個返回的是乙個指向字串中該字元最後一次出現的位置。

注意,此處字元區分大小寫。

查詢任何幾個字元

查詢任何一組字元第一次在字串**現的位置,原型如下:

//函式返回乙個指向str中第1個匹配group中任何乙個字元的字元位置。如果未找到匹配,返回乙個null指標

char

*strpbrk

(char

const

*str,

char

const

*group)

;

查詢乙個子串
//函式在s1中查詢整個s2第一次出現的起始位置,並返回乙個指向該位置的指標。

//如果s2並沒有完整地出現在s1的任何地方,函式將返回乙個null指標。

//如果第2個引數乙個空字串,函式就返回s1.

int*

strstr

(char

const

*s1,

char

const

*s2)

;

字串 字元和位元組

字串就是一串零個或多個字元,並且以乙個位模式為全0的nul位元組結尾。nul位元組是字串的終止符,但是它本身不是字串的一部分,所以字串的長度並不包括nul位元組。標頭檔案string.h包含了使用字串函式所需的原型和宣告。字串的長度就是它所包含的字元個數。strlen可求字串長度,返回值是size ...

字串和位元組

python3中只有一種能夠儲存文字資訊的資料型別,就是str string,子字串 它是不可便序列,儲存的是unicode碼位 code point 這是與python2的主要區別,python2用str表示位元組字串,這種型別在python3中用bytes物件來處理 但處理方式並不完全相同 py...

字串 字元 位元組

字串就是一串零個或多個字元,並且以乙個位模式為全0的nul位元組結尾。nul位元組是字串的終止符,但它本身並不是字串的一部分,所以字串的長度並不包括nul字元。複製字串 char strcpy char dst,char const src 這個函式把引數src字串複製到dst引數。如果引數src和...