字串就是一串零個或多個字元, 並且以乙個位模式為全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 ...