C語言字符串函數(shù)模擬實現(xiàn)流程介紹
該文章將簡易模擬實現(xiàn)strlen、strcpy、strcat、strcmp、strstr。那么讓我們廢話少說,直接開始吧。
一、strlen
strlen-Get string length.即獲取字符串長度。函數(shù)參數(shù)為 const char* str,函數(shù)返回類型為 size_t。如下圖所示:
strlen函數(shù)的讀取結(jié)束標(biāo)志為’\0’,因此,若字符串中沒有’\0’,字符串長度則為隨機值。
下面將以三種方式模擬實現(xiàn)strlen函數(shù),函數(shù)將命名為 my_strlen。
1.使用計數(shù)器
#include <stdio.h> #include <assert.h> size_t my_strlen(const char* str) { assert(str);//斷言一下傳過來的參數(shù)是否為空指針 size_t count = 0;//設(shè)置一個計數(shù)器 while (*str++) { count++; } return count; } int main() { char arr[] = "hello world!"; int ret = my_strlen(arr); printf("%d\n", ret); return 0; }
顯示結(jié)果:
該方法為設(shè)置一個計數(shù)器變量 count,讓計數(shù)器在指針每增加一個字節(jié)時自增一,當(dāng) *str 為’\0’時,循環(huán)結(jié)束,返回的count就是字符串長度。
2.使用函數(shù)遞歸
#include <stdio.h> #include <assert.h> size_t my_strlen(const char* str) { assert(str); if (*str != '\0') return 1 + my_strlen(str + 1); else return 0; } int main() { char arr[] = "hello world!"; int ret = my_strlen(arr); printf("%d\n", ret); return 0; }
顯示結(jié)果:
3.使用指針-指針
#include <stdio.h> #include <assert.h> size_t my_strlen(const char* str) { assert(str); const char* start = str; const char* end = str; while (*end != '\0') { end++; } return end - start; } int main() { char arr[] = "hello world!"; int ret = my_strlen(arr); printf("%d\n", ret); return 0; }
顯示結(jié)果:
二、strcpy
strcpy-Copy string.即拷貝字符串。函數(shù)參數(shù)為 char* dest 和 const char* scr,函數(shù)返回類型為 char*。如下圖所示:
源字符串必須以’\0’結(jié)束,目標(biāo)字符串會將’\0’一同拷貝
下面將模擬實現(xiàn)strcpy,函數(shù)命名為my_strcpy
#include <stdio.h> #include <assert.h> char* my_strcpy(char* dest, const char* scr) { assert(dest); assert(scr); char* start = dest;//記錄目標(biāo)指針的起始位置 while (*dest++ = *scr++) { ; } return start; } int main() { char arr1[20] = "xxxxxxxxxxxxxxxxxxx"; char arr2[] = "hello world!"; printf("%s\n", my_strcpy(arr1, arr2)); return 0; }
顯示結(jié)果:
三、strcat
strcat-Concatenate strings.即連接字符串。函數(shù)參數(shù)為 char* dest 和 const char* scr,函數(shù)返回類型為 char*。如下圖所示:
源字符串必須以’\0’結(jié)束,否則程序?qū)⒈罎ⅰ?/p>
下面將模擬實現(xiàn)strcat,函數(shù)命名為my_strcat
#include <stdio.h> #include <assert.h> char* my_strcat(char* dest, const char* scr) { assert(dest); assert(scr); char* start = dest; while (*dest != '\0') { dest++;//先將目標(biāo)指針遍歷到'\0'的位置上 } while (*dest++ = *scr++) { ; } return start; } int main() { char arr1[20] = "hello "; char arr2[] = "world!"; printf("%s\n", my_strcat(arr1, arr2)); return 0; }
顯示結(jié)果:
四、strcmp
strcmp-Concatenate strings.即比較兩個字符串。函數(shù)參數(shù)為 const char* str1 和 const char* str2,函數(shù)返回類型為 int。如下圖所示:
標(biāo)準(zhǔn)規(guī)定:
1. str1>str2,返回值>0
2. str1==str2,返回值=0
3. str1<str2,返回值<0
下面將模擬實現(xiàn)strcmp,函數(shù)命名為my_strcmp
#include <stdio.h> #include <assert.h> int my_strcmp(const char* str1, const char* str2) { assert(str1); assert(str2); while (*str1 == *str2) { if (*str1 != '\0')//兩個字符串對應(yīng)元素相等并都不為'\0'時,遍歷這個字符串 { str1++; str2++; } else return 0;//此為直到兩個字符串結(jié)束都相等,所以返回0 } return *str1 - *str2;//不相等時返回兩個字符串對應(yīng)元素的差值即可判斷大小。 } int main() { char arr1[] = "abc"; char arr2[] = "abcd"; int ret = my_strcmp(arr1, arr2); if (ret > 0) { printf("arr1>arr2\n"); } else if (ret < 0) { printf("arr1<arr2\n"); } else printf("arr1==arr2\n"); return 0; }
顯示結(jié)果:
到此這篇關(guān)于C語言字符串函數(shù)模擬實現(xiàn)流程介紹的文章就介紹到這了,更多相關(guān)C語言字符串函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++11新特性之右值引用與完美轉(zhuǎn)發(fā)詳解
C++11標(biāo)準(zhǔn)為C++引入右值引用語法的同時,還解決了一個短板,即使用簡單的方式即可在函數(shù)模板中實現(xiàn)參數(shù)的完美轉(zhuǎn)發(fā)。本文就來講講二者的應(yīng)用,需要的可以參考一下2022-09-09淺析C++中memset,memcpy,strcpy的區(qū)別
本篇文章是對C++中memset,memcpy,strcpy的區(qū)別進行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07