c和指標 字串 字元 位元組

2021-08-05 23:54:51 字數 4147 閱讀 2982

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

函式原型:

size_t strlen(char const *string)

這個函式中出現了size_t型別, 這個型別是在stddef.h中定義的, 它是乙個無符號的整型。但是在表示式中可能導致不可預料的結果, 比如:

if (strlen (x) >= strlen (y))   // 1

if (strlen (s) - strlen (y) >= 0) // 2

這兩個判斷語句看上去功能是一致的, 但是它們其實是不同的。 第乙個語句功能和你想的一樣, 但是第二個語句就不是了, 因為size_t是無符號型別, 所以兩個size_t型別相減的結果也是無符號數; 而無符號數不可能是負的; 如果你想消除這種影響, 可以將size_t型別強制轉換為 int 型別。

最常用的字串函式都是「不受限制的」, 就是說它們只是通過尋找字串引數結尾的nul位元組來判斷它的長度。 這些函式一般都指定一塊記憶體用於存放結果字串。 在使用這些函式時, 程式設計師必須保證結果字串不會溢位這塊記憶體。

strcpy函式

char *strcpy(char *dst,const

char *src)

關於memcpy函式可以參考一下:memcpy函式詳解

這個函式要注意的一些地方,

由於dst引數會被修改, 所以dst引數必須是乙個字元陣列或者動態分配記憶體空間的陣列指標。

必須保證目標字元陣列的空間足以容納需要複製的字串。 如果字串比數組長, 多餘的字元仍被複製, 它們將覆蓋儲存於dst陣列後面的內容。

如果dst和src的在記憶體空間出現重疊, 結果是未定義的。

將乙個字串連線到乙個字串的後面, strcat函式

char * my_strcat(char * dest,const

char *src)

*p='\0'; //新字串的終止符

return dest;

}

這個函式要注意的一些地方。

dst引數原先已經包含了乙個字串(可以為空)。它找到這個字串的末尾, 並把sre字串的乙份拷貝加到這個位置。

如果dst和src在記憶體中的位置出現重疊, 結果是未定義的。

必須保證目標字元陣列剩餘的空間足以儲存整個源字串。(記住要加上原來的字串

strpy和strcat都返回它們第1個引數的乙份拷貝, 就是指向目標字串陣列的指標。, 由於它們都返回這種型別的值, 所以可以巢狀使用這些函式:

strcat(strcat(dst, a), b);
strcpy首先執行, 將字串a複製到dst並返回dst, 將這個返回值成為strcat函式的第乙個引數, 再將字串b連線到第乙個引數後面。

從第乙個字元開始逐個比較, 知道發現不匹配的為止。 比較是以在字符集中的序數比較的, 對於第乙個不匹配的字元, 該字元在字符集中的序數「小」, 則該字串「較小」, 如果乙個字串包含另外乙個字串, 那麼稱被包含的那個字串「較小」。 其實就是「詞典比較」。

int

strcmp (const

char *str1, const

char *str2)

if (ret < 0)

else

if (ret > 0)

return

0}

如果 str1 < str2, 返回乙個小於零的值, 如果 str1 > str2, 函式返回乙個大於零的值。 如果兩個字串相等, 函式返回零。 並不是返回什麼 -1, 1, 0。標準庫中還包含了一些函式, 它們以一種不同的方式處理字串。 這些函式接受乙個顯示的長度引數, 用於限定進行複製或比較的字元數。

下面是一些函式的受限形式, 它們的原型分別為:

char *strncpy (char *dst, char

const *src, size_t len);

char *strncat (char *dst, char

const *src, size_t len);

char

strncmp (char

const *s1, char

const *s2, size_t len);

和strcpy一樣, strncpy把源字串的字元複製到目標陣列中。 然而, 它總是正好向dst寫入長度為len個字元。 如果strlen(src)的值小於len, dst陣列就用額外的nul位元組填充到len長度。 如果len的值大於或等於len, 那麼只有len個字元被複製到dst中。 注意:它的結果不會以nul位元組結尾strncat函式和strncpy不同之處在於。 它從src中最多複製len個字元到目標陣列後面。 但是, strncat總是在結果字串後面新增乙個nul位元組, 而且它不會像strncpy那樣對目標陣列進行nul位元組填充。注意目標陣列中原先的字串並沒有算在strncat的長度中。 strnct最多像目標陣列複製len個字元。(再加乙個nul結尾)

strncmp也是用於比較兩個字串, 但它最多比較len個位元組。如果兩個字串在第len個字元之前存在不相等的字元, 這個函式就停止比較, 返回結果。 如果兩個字串的前len個字元相等, 函式返回零。

字串的一些查詢函式

strchr和strrchr函式。 它們的函式原型如下:

char * strchr (char

const *str, int ch);

char * strrchr (char

const *str, int ch);

函式用法說明:strchr函式在str中查詢ch第一次出現的位置, 然後返回乙個指向該位置的指標。 如果不存在返回null指標。 strrchr與strchr基本一致; 只不過查詢的是該字元在字串中最後出現的乙個位置。

char

string [20] = "hello there, honey";

char *ans;

ans = strchr(string, 'h');

ans會返回乙個指向』h』的指標, 注意:這裡是區分大小寫的。

strpbrk:查詢任何一組字元第一次在字串中的位置。 它的函式原型如下:

char * strpbrk(char

const *str, char

const *group);

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

char

string[20] = "hello there, honey";

char ans;

ans = strpbrk(string, "eafsd");

ans所指的位置是』e』的位置。

strstr:查詢乙個子串。 函式原型:

char * strstr(char

const * s1 , char

const * s2);

這個函式返回乙個指向s2在s1中起始位置的指標。如果s2沒有完整出現在s1的任何地方, 返回null指標。

注意:標準庫中並不包含strrstr或strrpbrk函式(即返回指向最右邊的指標)

它們的原型位於ctype.h這個標頭檔案中

tolower返回ch的小寫形式, toupper返回ch的大寫形式。(如果它們的引數形式與返回值形式一致, 函式將不修改引數直接返回)

c和指標 字串 字元 位元組

1.strspn 返回字串中第乙個不在指定字串中出現的字元下標 表頭檔案 include定義函式 size t strspn const char s,const char accept 函式說明 strspn 從引數s 字串的開頭計算連續的字元,而這些字元都完全是accept 所指字串中的字元。簡...

字串 字元和位元組

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

字串 字元和位元組

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