C語言詳細(xì)講解strcpy strcat strcmp函數(shù)的模擬實現(xiàn)
一、模擬實現(xiàn)strcpy函數(shù)
strcpy函數(shù)是字符串拷貝函數(shù),就是將源字符串拷貝到目標(biāo)空間中。
char * strcpy ( char * destination, const char * source );//庫函數(shù)中的聲明
將源(source)指向的c字符串復(fù)制到目標(biāo)(destination)指向的數(shù)組中,包括終止的空字符(并在該點停止)。
為避免溢出,目標(biāo)(destination)指向的數(shù)組的大小應(yīng)足夠長,以包含與源相同的C字符串(包括終止的空字符),并且在內(nèi)存中不應(yīng)與源重疊。
在這里需要注意:
1、源字符串必須以 '\0' 結(jié)束。
2、會將源字符串中的 '\0' 拷貝到目標(biāo)空間。
3、目標(biāo)空間必須足夠大,以確保能存放源字符串。
4、目標(biāo)空間必須可變。
下面就用my_strcpy來模擬實現(xiàn)stcpy函數(shù)。
#include <stdio.h> #include <assert.h>//assert的頭文件 char* my_strcpy(char* dest,const char* src)//這里用const修飾所指向的源字符串,因為源字符串是 //常量字符串,不能被修改 { char* ret = dest; assert(dest);//斷言源字符串和目標(biāo)空間都不能為空指針 assert(src); while (*dest++ = *src++)//一個字符串一個字符串的拷貝,遇到'\0'結(jié)束 { ; } return ret;//返回目標(biāo)空間的起始地址 } int main() { char arr1[20] = { 0 }; char arr2[] = "hello"; printf("%s", my_strcnpy(arr1, arr2)); return 0; }
以上是整個字符串的拷貝,如果我們不拷貝整個字符串,只拷貝字符串里面的幾個字符,我們可以怎么做呢?接下來我們來看看strncpy這個函數(shù),這個函數(shù)可以實現(xiàn)只拷貝字符串里面的幾個字符。這個函數(shù)的模擬實現(xiàn)大體上跟strcpy函數(shù)是一樣的,只是這里有了長度限制,接下來用my_strncpy來模擬實現(xiàn)。
#include <stdio.h> #include <assert.h> char* my_strcnpy(char* dest, const char* src, size_t n) { char* ret = dest; assert(dest); assert(src); int i = 0; for (i = 0; i < n; i++)//要拷貝幾個字符,循環(huán)幾次 { *dest++ = *src++; } return ret; } int main() { char arr1[20] = { 0 }; char arr2[] = "hello"; printf("%s", my_strcnpy(arr1, arr2, 3));//3就是我們要拷貝的字符串的大小,這里就相當(dāng)于將前三個字符hel進(jìn)行拷貝(這里也可以將整個字符串拷貝,只要知道大?。? return 0; }
二、模擬實現(xiàn)strcat函數(shù)
strcat是連接字符串函數(shù),它的作用是將源字符串附加到目標(biāo)字符串。目標(biāo)中終止的空字符被源字符串中的第一個字符覆蓋,空字符包含在由目標(biāo)中的兩個字符串聯(lián)而成的新字符串的末尾。
char * strcat ( char * destination, const char * source );//庫函數(shù)中的聲明
在這里需要注意:
1、源字符串必須以 '\0' 結(jié)束,目的地也必須以 '\0' 結(jié)束
2、目標(biāo)空間必須有足夠的大,能容納下源字符串的內(nèi)容。
3、目標(biāo)空間必須可修改。
下面就用my_strcat來模擬實現(xiàn)strcat函數(shù)。
#include <stdio.h> #include <assert.h> char* my_strcat(char* dest, const char* src)這里用const修飾所指向的源字符串,因為源字符串是 //常量字符串,不能被修改 { char* ret = dest; assert(dest); assert(src); while (*dest != '\0')\\找到目標(biāo)空間的結(jié)束標(biāo)志處,然后開始連接 { dest++; } while (*dest++ = *src++) { ; } return ret;//返回目標(biāo)空間的起始地址 } int main() { char arr1[20] = "abc"; char arr2[] = "def"; printf("%s\n", my_strncat(arr1, arr2)); return 0; }
對于字符串連接還有一個函數(shù)strncat也能描述,但是這個函數(shù)是有長度限制的,可以連接一個字符串里面的幾個字符或者整個字符串。下面就用my_strncat來模擬實現(xiàn)strcat函數(shù)。
#include <stdio.h> #include <assert.h> char* my_strncat(char* dest, const char* src,size_t n) { char* ret = dest; assert(dest); assert(src); int i = 0; while (*dest != '\0')\\找到目標(biāo)空間的結(jié)束標(biāo)志處,然后開始連接 { dest++; } for (i = 0; i < n; i++)//要連接幾個字符,循環(huán)幾次 { *dest++ = *src++; } return ret;//返回目標(biāo)空間的起始地址 } int main() { char arr1[20] = "abc"; char arr2[] = "def"; printf("%s\n", my_strncat(arr1, arr2, 2));//需要連接幾個字符串,就將它們的大小傳過去,這里這里的2就是字符串里面"de"的大小,將"de"兩個字符傳過去 return 0; }
三、模擬實現(xiàn)strcmp函數(shù)
strcmp是字符串比較函數(shù),比較兩個字符串str1和str2,此函數(shù)開始比較每個字符串的第一個字符。如果它們彼此相等,則繼續(xù)往下比,直到字符不同或到達(dá)終止的空字符。
int strcmp ( const char * str1, const char * str2 );//庫函數(shù)中的聲明
第一個字符串大于第二個字符串,則返回大于0的數(shù)字
第一個字符串等于第二個字符串,則返回0
第一個字符串小于第二個字符串,則返回小于0的數(shù)字
下面用my_strcmp來模擬實現(xiàn)strcmp函數(shù):
#include <stdio.h> #include <assert.h> int my_strcmp(const char* str1, const char* str2) { assert(str1); assert(str2); while (*str1 == *str2)//先看首字符如果這兩個字符是否相等,如果相等繼續(xù)往下比,不相等跳出去比較大小 { if (*str1 == '\0')//判斷是否已經(jīng)比完了所有字符,如果已經(jīng)比完了返回0,說明這兩個字符串相等 { return 0; } else//如果沒有比完,繼續(xù)往下一個比 { str1++; str2++; } } //如果兩個字符不相等,那就比大小,返回大于0的數(shù)則說明str1>str2,反之小于。 return *str1 - *str2; } int main() { char arr1[20] = "abcefg"; char arr2[] = "efghij"; int ret = my_strcmp(arr1, arr2); if (ret > 0) { printf("大于\n"); } else if (ret < 0) { printf("小于\n"); } else { printf("等于\n"); } return 0; }
有長度限制的比較函數(shù)strncmp,下面用my_strncmp模擬實現(xiàn):
#include <stdio.h> #include <assert.h> int my_strncmp(const char* str1, const char* str2,int n) { int i = 0; for (i = 0; i < n; i++)//需要比較幾個字符循環(huán)幾次 { if (*(str1 + i) == *(str2 + i))//先看首字符如果這兩個字符是否相等,如果相等繼續(xù)往下比,不相等跳出去比較大小 { if (*str1 == '\0')//判斷是否已經(jīng)比完了所有字符,如果已經(jīng)比完了返回0,說明這兩個字符串相等 { return 0; } else//如果沒有比完,繼續(xù)往下一個比 str1++; str2++; } //如果兩個字符不相等,那就比大小,返回大于0的數(shù)則說明str1>str2,反之小于。 return *str1-*str2; } } int main() { char arr1[20] = "abcefg"; char arr2[] = "efghij"; int ret = my_strncmp(arr1, arr2,2); if (ret > 0) { printf("大于\n"); } else if (ret < 0) { printf("小于\n"); } else { printf("等于\n"); } return 0; }
四、小結(jié)
以上就是字符串的庫函數(shù)的模擬實現(xiàn)。主要講了一種是長度不受限制的字符串函數(shù)(strcpy,strcat,strcmp),一種是長度受限制(strncpy,strncat,strncmp)的字符串函數(shù)。
到此這篇關(guān)于C語言詳細(xì)講解strcpy strcat strcmp函數(shù)的模擬實現(xiàn)的文章就介紹到這了,更多相關(guān)C語言strcpy strcat strcmp內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語言中strcpy和strcat的使用和模擬實現(xiàn)
- C語言string庫strcpy、strcmp、strcat函數(shù)的使用
- 利用C語言模擬實現(xiàn)qsort,strcpy,strcat,strcmp函數(shù)
- C語言strlen,strcpy,strcmp,strcat,strstr字符串操作函數(shù)實現(xiàn)
- 徹底掌握C語言strcat函數(shù)的用法
- C語言 模擬實現(xiàn)strcpy與strcat函數(shù)詳解
- C語言字符串函數(shù)操作(strlen,strcpy,strcat,strcmp)詳解
- strcat 函數(shù)的使用指南
- strcat函數(shù)實現(xiàn)簡單示例
- c++實現(xiàn)strcat字符串連接庫函數(shù)的方法詳解
- c++ 連接兩個字符串實現(xiàn)代碼 實現(xiàn)類似strcat功能
- C語言strcat函數(shù)詳解:字符串追加的利器
相關(guān)文章
C++面向?qū)ο笳Z言自制多級菜單功能實現(xiàn)代碼
菜單類主要負(fù)責(zé)菜單的創(chuàng)建、修改、刪除,是包含菜單結(jié)構(gòu)組織和響應(yīng)函數(shù)的模型,用戶擁有充分的自主性,可根據(jù)需要自定義菜單顯示和響應(yīng)函數(shù),這篇文章主要介紹了C++面向?qū)ο笳Z言自制多級菜單,需要的朋友可以參考下2024-06-06C++實現(xiàn)LeetCode(128.求最長連續(xù)序列)
這篇文章主要介紹了C++實現(xiàn)LeetCode(128.求最長連續(xù)序列),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07關(guān)于函數(shù)傳參問題(指針傳參,值傳參,引用傳參)
這篇文章主要介紹了關(guān)于函數(shù)傳參問題(指針傳參,值傳參,引用傳參),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Windows下ncnn環(huán)境配置教程詳解(VS2019)
這篇文章主要介紹了Windows下ncnn環(huán)境配置(VS2019),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03C++基于socket多線程實現(xiàn)網(wǎng)絡(luò)聊天室
這篇文章主要為大家詳細(xì)介紹了C++基于socket多線程實現(xiàn)網(wǎng)絡(luò)聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07C++ 中動態(tài)鏈接庫--導(dǎo)入和導(dǎo)出的實例詳解
這篇文章主要介紹了C++ 中動態(tài)鏈接庫--導(dǎo)入和導(dǎo)出的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09