在編寫程序過程中,我們經常使用到一些字符串函數,例如求字符串長度,拷貝字符串……,這些函數都在C標準庫中存在,我們可以直接使用。但我們還需要掌握這些函數的實現方法,今天來看看一些常用的字符串操作函數的實現方法。
帶長度參數的函數 1. strlenstrlen是用來求字符串長度的函數,字符串長度就是字符串中包含的字符的個數,但是不包含字符串結尾的 『\0』實現strlen有三種方法:
(1)定義一個計數器size_t mystrlen(const char* str)
{
size_t count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
(2)遞歸版本size_t my_strlen(const char *str)
{
if (*str == '\0')
return 0;
else
return my_strlen(str + 1) + 1;
}
(3)利用指針 - 指針size_t mystrlen(const char* str)
{
const char* end = str;
while (*end++);
return end - str - 1;
}
2.strcpy用於複製字符串的函數是strcpy,它的原型如下:
char* strcpy ( char* dest, const char* src );使用這個函數時,要注意幾點(1)目標字符數組的空間必須足夠大,足以容納需要複製的字符串(2)目標字符數組要可以被修改(3)被複製的字符串要可以找到』\ 0』
char *mystrcpy(char *dest, const char *src)
{
char *res = dest;
assert(dest);
assert(src);
while (*dest++ = *src++) ;//注意這裡是一個等號
return res;
}
3.strcatstrcat函數是可以把一個字符串添加(連接)到另一個字符串的後面。strcat函數要求dest參數原先已經包含了一個字符串(可以是空字符串)。它找到這個字符串的末尾,並把src字符串的一份拷貝添加到這個位置。
char *mystrcat(char *dest, const char *src)
{
char *res = dest;
assert(dest);
assert(src);
while (*dest != '\0')
dest++;
while (*dest++ = *src); //這裡同樣也是一個等號
return res;
}
4.strcmpstrcmp用於比較兩個字符串,及對兩個字符串對應的字符逐個進行比較,直到發現不匹配。那個最先不匹配的字符中較「小」的那個字符所在的字符串被認為「小於」另外一個字符串。如果其中一個字符串是另外一個字符串的前面一部分,那麼它也被認為「小於」另外一個字符串,因為它的』\0』出現的更早。
int my_strcmp(const char* src1, const char* src2)
{
while (*src1 == *src2)
{
if (*src1 == '\0')
return 0;
src1 ++;
src2 ++;
}
return *src1 - *src2;
}
5.strstr為了在一個字符串中查找一個子串,可以使用strstr函數,該函數是在s1中查找整個s2第1次出現的起始位置,並返回一個指向該位置的指針。如果s2並沒有出現在s1的任何地方,函數將返回一個NULL指針。如果第二個函數是一個空字符串,函數就返回s1。
char* my_strstr(char* s1, const char* s2)
{
char* p = s1;
const char* q = s2;
char* cur = NULL;
assert(s1);
assert(s2);
if (*s2 == '\0')
return s1;
while (*p != '\0')
{
cur = p;
while ((*p != '\0') && (*q != '\0') && (*p == *q))
{
p++;
q++;
}
if (*q == '\0')
return cur;
p = cur + 1;
q = s2;
}
return NULL;
}
6.strchrstrchr是用來查找一個特定的字符,在字符串str中查找字符ch第一次出現的位置,找到後函數返回一個指向該位置的指針。如果該字符並不存在於字符串中,函數就返回一個NULL指針
char* my_strchr(const char* str, char ch)
{
const char* tmp = str;
while (*tmp)
{
if (*tmp == ch)
return tmp;
tmp++;
}
return NULL;
}
7.strrchr與strchr類似的查找函數還有一個是strrchr,它和strchr的不同之處在於,該函數返回的是一個指向字符串中該字符最後一次出現的位置
char* my_strrchr(const char* str, int ch)
{
char* pos = 0;
assert(str);
while (*str)
{
if (*str == ch)
{
pos = str;
}
str++;
}
if (pos != 0)
{
return pos;
}
else
return NULL;
}
長度受限制的字符串函數標準庫中還包含一些函數,它們以一種不同的方式去處理字符串。這些函數接受一個顯示的長度參數,用於限定進行複製或比較的字符數。
1.strncpy和strcpy一樣,strncpy()函數把源字符串的字符複製到目標空間,但是,它總是正好向dest中拷貝len個字符,如果strlen的(src)的值小於len,dest數組就用額外的』\0』填充到len字節長度。如果strlen的(src)的值大於或等於len,那麼只有len個字符被複製到目標寄存器中。
char* my_strncpy(char* dest, const char* src, size_t len)
{
char* res = dest;
assert(dest);
assert(src);
while (len--)
{
*res++ = *src++;
}
if (*(res) != '\0')
*res = '\0';
return dest;
}
2.strncatstrncat函數,它從src中最多複製的len個字符到目標數組的後面。
char* my_strncat(char* dest, const char* src, size_t len)
{
char* res = dest;
assert(dest);
assert(src);
while (*dest != '\0')
dest++;
while (len--)
{
*dest = *src;
dest++;
src++;
}
return res;
}
3.strncmpstrncmp也用於比較兩個字符串,但它最多比較len個字節。如果兩個字符串在第len個字符之前存在不相等的字符,這個函數就像的strcmp一樣停止比較,返回結果。如果兩個字符串的前len個字符相等,函數就返回零。
int my_strncmp(const char* s1, const char* s2, size_t len)
{
assert(s1);
assert(s2);
while (len--)
{
if (*s1 == *s2)
{
s1++;
s2++;
}
else
return *s1 - *s2;
}
return 0;
}標準庫裡的字符串函數還有很多,今天就先介紹到這裡。
溫馨提示由於微信公眾號近期改變了推送規則,如果您想經常看到我們的文章,可以在每次閱讀後,在頁面下方點一個「贊」或「在看」,這樣每次推送的文章才會第一時間出現在您的訂閱列表裡。
版權聲明:本文來源網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯繫我進行刪除。
猜你喜歡:
實用 | 分享幾個非常實用的開源項目
C語言實現MD5加密(附代碼)
每天都能見到的 extern "C" 並沒有那麼簡單!
不按套路出牌,這麼來寫IIC驅動?
乾貨 | C語言實現面向對象編程(附代碼)
2020年精選原創筆記匯總
在公眾號聊天界面回復1024,可獲取嵌入式資源;回復 m ,可查看文章匯總。
文章都看完了不點個嗎