字串 字元和位元組

2022-09-03 02:51:06 字數 2487 閱讀 5010

字串就是一串零個或多個字元,並且以乙個位模式為全0的nul位元組結尾。nul位元組是字串的終止符,但是它本身不是字串的一部分,所以字串的長度並不包括nul位元組。

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

字串的長度就是它所包含的字元個數。strlen可求字串長度,返回值是size_t型別,該型別在標頭檔案stddef.h中定義,是乙個無符號整數型別。在表示式中使用無符號數可能會導致不可預料的結果,例如,下面兩個表示式看上去是相等的:

if (strlen(x) >= strlen(y))....

if (strlen(x) - strlen(y) >= 0)...

但事實上它們是不相等的,第1條語句按照預想的工作,但第2條語句的結果將永遠是真。strlen的結果是個無符號數,所以操作符》=左邊的表示式也將是無符號數,而無符號數絕不可能是負的。

表示式中如果同時 包含了有符號數和無符號數,可能會產生奇怪的結果。如果把strlen的返回值強制轉換為int,就可以消除這個問題。

尋找一種更好的演算法比改良一種差勁的演算法更有效率,復用已經存在的軟體比重新開發乙個效率更高。

strcpy和strcat都返回它們第乙個引數的乙份拷貝。就是乙個指向目標字元陣列的指標。由於它們返回這種型別的值,所以可以巢狀地呼叫這些函式,如:

strcat(strcpy(dst, a), b);

但是這種巢狀呼叫的風格較可讀性更佳的拆開的風格在功能上並無優勢。

int strcmp(char const *s1, char const *s2);

如果s1小於s2,strcmp函式返回乙個小於零的值,如果s1大於s2,函式返回乙個大於零的值,如果兩個字串相等,函式返回零。

把這種返回值當做布林值進行測試是一種壞風格,因為它具有三個截然不同的結果,所以,更好的方法是把這個返回值與零進行比較。

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

所以,strncpy呼叫的結果可能不是乙個字串,因為字串必須以nul位元組結尾。如果在乙個需要字串的地方(例如strlen函式的引數)使用了乙個不是以nul結尾的字串行,strlen()會一直找到發現乙個nul為止,如果函式試圖訪問系統分配給這個程式以外的記憶體範圍,程式就會崩潰。這個問題只有當你使用strncpy函式建立字串,然後或者對它們使用str開頭的庫函式,或在printf中使用%s格式列印它們時才發生。在使用不受限的函式之前,你首先必須確定字串實際上是以nul位元組結尾的。

而strncat總是在結果字串後面新增乙個nul位元組。strncat不管目標引數除去原先存在的字串後留下的空間夠不夠。

在乙個字串中查詢乙個特定字元最容易的方法是使用strchr和strrchr函式。

char * strchr(char const *str, int ch);

char * strrchr(char const *str, int ch);

char * strpbrk(char const *str, char const *group);

char * strstr(char const *s1, char const *s2);

標準庫中不存在strrstr或strrpbrk

char * strtok(char * str, char const *sep);

根據定義,字串由乙個nul位元組結尾,所以字串內部不能包含任何nul字元。但是,非字串資料內部包含零值的情況並不罕見,你無法使用字串函式來處理這種型別的資料,因為當它們遇到第1個nul位元組時將停止工作。

此時,我們可以使用另一組相關的函式,它們的操作與字串函式類似,但這些函式能夠處理任意的位元組序列。

void *memcpy(void * dst, void const *src, size_t length);

void *memmove(void *dst, void const *src, size_t length);

void *memcmp(void const * a, void const * b, size_t length);

void *memchr(void const *a , int ch, size_t length);

void *memset(void *a, int ch, size_t length);

每個原型都包含乙個顯示的引數說明需要處理的位元組數,但和strn帶頭的函式不同,它們在遇到nul位元組時不會停止操作。

memcpy從src的起始位置複製length個位元組到dst的記憶體起始位置。你可以用這個方法複製任何型別的值,第3個引數指定複製值的長度(以位元組計)。如果src和dst以任何形式出現了重疊,結果的未定義的。

如果兩個陣列都是整型陣列,不需要使用強制型別轉換,因為在函式的原型中,引數的型別是void *指標,任何型別的指標都可以轉換為viod*型指標。

字串 字元和位元組

字串是由乙個個字元組成的,每個字元又由乙個或多個位元組來表示,每個位元組又由8個bit位來表示。字元 計算機中使用的文字和符號,比如1 2 a b 等等。位元組 byte 一種計量單位,表示資料量多少,它是計算機資訊技術用於計量儲存容量的一種計量單位。不同編碼裡,字元和位元組的對應關係不同 asci...

字串和位元組

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和...