C語言實現字符串操作函數的實例
在編寫程序的過程中,我們經常使用到一些字符串函數,例如求字符串長度,拷貝字符串……,這些函數都在C標準庫中存在,我們可以直接使用。但我們還需要掌握這些函數的實現方法,今天來看看一些常用的字符串操作函數的實現方法。
1.strlen
strlen是用來求字符串長度的函數,字符串長度就是它所包含的字符個數。
今天給大家介紹三種實現strlen函數的方法
(1)定義一個計數器count
//方式一:定義一個計數器size_t my_strlen(const char *str){ int count = 0; while (*str) { 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 my_strlen(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 *my_strcpy(char *dest, const char *src){ char *tmp = dest; assert(dest); assert(src); while (*dest++ = *src++) { ; } return tmp;}
3.strcat
strcat函數是可以把一個字符串添加(連接)到另一個字符串的后面。strcat函數要求dest參數原先已經包含了一個字符串(可以是空字符串)。它找到這個字符串的末尾,并把src字符串的一份拷貝添加到這個位置。
char *my_strcat(char *dest, const char *src){ char *ret = dest; assert(dest); assert(src); while (*dest != '/0') { dest++; } while (*dest++ = *src++) { ; } return ret;}
4.strcmp
strcmp用于比較兩個字符串,及對兩個字符串對應的字符逐個進行比較,直到發現不匹配。那個最先不匹配的字符中較“小”的那個字符所在的字符串被認為“小于”另外一個字符串。如果其中一個字符串是另外一個字符串的前面一部分,那么它也被認為“小于”另外一個字符串,因為它的'/0'出現的更早。需要注意的是,strcmp函數對于只包含大寫字母或只包含小寫字母的字符串比較。
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(const char* s1, const char* s2){ const char *p = s1; const char *q = s2; const char *cur = NULL; assert(s1); assert(s2); if (*s2 == '/0') return s1; while (*p) { cur = p; while ((*p) && (*q) && (*p == *q)) { p++; q++; } if (*q == '/0') return cur; p = cur + 1; q = s2; } return NULL;}
6.strchr
strchr是用來查找一個特定的字符,在字符串str中查找字符ch第一次出現的位置,找到后函數返回一個指向該位置的指針。如果該字符并不存在于字符串中,函數就返回一個NULL指針。
char *my_strchr(char const *str, int 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個字符被復制到dest中。
char *my_strncpy(char *dest, const char *src, size_t len){ char *ret = dest; size_t i = 0; assert(dest); assert(src); while (len--) { *ret++ = *src++; } if (*(ret) != '/0') { *ret = '/0'; } return dest;}
2.strncat
strncat,它從src中最多復制len個字符到目標數組的后面。
char *my_strncat(char *dst, const char *src, size_t len){ char *ret = dst; assert(dst); assert(src); while (*dst != '/0') { dst++; } while (len--) { *dst = *src; dst++; src++; } return ret;}
3.strncmp
strncmp也用于比較兩個字符串,但它最多比較len個字節。如果兩個字符串在第len個字符之前存在不相等的字符,這個函數就像strcmp一樣停止比較,返回結果。如果兩個字符串的前len個字符相等,函數就返回零。
int my_strncmp(char const *s1, char const *s2, size_t len){ assert(s1); assert(s2); while (len--) { if (*s1 == *s2) { s1++; s2++; } else { return *s1 - *s2; } } return 0;}
標準庫里的字符串函數還有很多,今天就先介紹到這里。
以上就是C語言字符串的操作總結 ,如有疑問,請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答
圖片精選