字串是由乙個個字元組成的,每個字元又由乙個或多個位元組來表示,每個位元組又由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
引數。如果引數src
和dst
在記憶體**現重疊,其結果是未定義的。
由於dst
引數將進行修改,因此它必須是個字元陣列,或者是乙個指向動態分配記憶體的陣列的指標,不能使用字串常量。
注意:程式設計師必須保證目標字元陣列的空間足以容納需要複製的字串。如果字串比數組長,多餘的字元仍被複製,它們將覆蓋原先儲存與陣列後面的記憶體空間的值。strcpy
無法解決這個問題,因為它無法判斷目標字元陣列的長度。
2. 連線字串
把乙個字串新增(連線)到另乙個字串的後面,可以使用strcat
函式,原型如下:
char
*strcat
(char
*dst,
char
const
*src)
;
strcat
函式要求dst
引數原先已經包含了乙個字串(可以是空字串)。找到這個字串的末尾,並把src
字串的乙份副本新增到這個位置。如果引數src
和dst
的位置發生重疊,其結果是未定義的。
strcpy
和strcat
都返回它們第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)
的值小於len
,dst
陣列就用額外的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和...