赶紧来修炼内功~字符串函数详解大全(二)
目錄
1.strncpy
重點(diǎn):
?模擬實(shí)現(xiàn):
?2.strncat
重點(diǎn):
模擬實(shí)現(xiàn):?
3.strncmp
?重點(diǎn):
?模擬實(shí)現(xiàn):
寫(xiě)在最后:
1.strncpy
該函數(shù)包含三個(gè)參數(shù),前兩個(gè)參數(shù)與上一篇文章中講解的strcpy函數(shù)一樣,一個(gè)目的地,一個(gè)源,第三個(gè)為要拷貝的字節(jié)數(shù) (注意這里是字節(jié)數(shù)!)
重點(diǎn):
1. 拷貝num個(gè)字符從源字符串到目標(biāo)空間。
2. 如果源字符串的長(zhǎng)度小于num,則拷貝完源字符串之后,在目標(biāo)的后邊追加0,直到num個(gè)。?
?1.
#include <stdio.h> #include <string.h> int main() {char arr1[15] = "abcdefghij";char arr2[] = "1234";strncpy(arr1, arr2, 4);printf("%s\n", arr1);return 0; }?
從arr2中拷貝4個(gè)字節(jié)的內(nèi)容到arr1,只會(huì)覆蓋掉前4個(gè)字節(jié)的內(nèi)容,不會(huì)全部覆蓋。
2.?
#include <stdio.h> #include <string.h> int main() {char arr1[15] = "abcdefghij";char arr2[] = "1234";strncpy(arr1, arr2, 6);printf("%s\n", arr1);return 0; }?這里我們要從arr2中拷貝6個(gè)字節(jié)的內(nèi)容到arr1,但是arr2中只有4個(gè)字節(jié)的內(nèi)容,所以拷貝完arr2的內(nèi)容后要在后面追加兩個(gè)0;
'\0'的ASCII碼值就是0,所以打印arr1時(shí),會(huì)提前終止打印。
?模擬實(shí)現(xiàn):
創(chuàng)建一個(gè)my_strncpy函數(shù),模擬實(shí)現(xiàn)strncpy函數(shù)的功能:
其實(shí)與模擬實(shí)現(xiàn)strcpy函數(shù)類(lèi)似,只不過(guò)多了一個(gè)控制拷貝多少個(gè)字節(jié)的參數(shù)而已~
#include <stdio.h> #include <assert.h> char* my_strncpy(char* dest, const char* src, size_t num)//返回值類(lèi)型參數(shù)類(lèi)型與原函數(shù)保持一致 {//dest所指向的字符串需要被修改,不用const保護(hù),src所指向的字符串不需要被修改用const修飾保護(hù)assert(dest && src);//斷言一下,保證兩個(gè)指針均不為空指針,若為空指針則中止程序并報(bào)錯(cuò)char* ret = dest;//創(chuàng)建一個(gè)char*變量保存起始地址,后面需要返回起始地址while (num--) //控制拷貝幾個(gè)字節(jié){*dest = *src; //拷貝if (*src != '\0') //若src所指向的字符串沒(méi)有到'\0'就繼續(xù)++src++; //++,指向下一個(gè)字符dest++; //++,指向下一個(gè)字符}return ret; //返回字符串起始位置 } int main() {char arr1[] = "abcdefg";char arr2[] = "1234";printf("%s\n", my_strncpy(arr1, arr2, 6));return 0; }?2.strncat
該函數(shù)包含三個(gè)參數(shù),前兩個(gè)參數(shù)與上一篇文章中講解的strcat函數(shù)一樣,一個(gè)目的地,一個(gè)源,第三個(gè)為要追加的字節(jié)數(shù) (注意這里是字節(jié)數(shù)!)
重點(diǎn):
1. 在目標(biāo)字符串后面追加num個(gè)字節(jié)
2. 追加是從目標(biāo)字符串最后的'\0'開(kāi)始追加的,同時(shí)追加完成后會(huì)自動(dòng)在最后補(bǔ)上一個(gè)'\0'
3. 如果源字符串的長(zhǎng)度小于num,則就只追加完源字符串,再補(bǔ)上一個(gè)'\0'就結(jié)束了
4. 可以用該函數(shù)自己給自己追加
?1.
int main() {char arr1[15] = "abcdef";char arr2[] = "abcd";strncat(arr1, arr2, 2);printf("%s\n", arr1);return 0; }在arr1后面追加兩個(gè)字節(jié)的arr2的內(nèi)容。
2.
?
?由上面兩個(gè)步驟的對(duì)比,可以很清晰地看出追加是從目標(biāo)字符串最后的'\0'開(kāi)始追加的。?
int main() {char arr1[15] = "abcdef\0xxxx";char arr2[] = "abcd";strncat(arr1, arr2, 2);printf("%s\n", arr1);return 0; }?在arr1字符串中間加上一個(gè)'\0'那么就會(huì)從這個(gè)'\0'處開(kāi)始追加,我們可以看到追加完"ab"后,又追加了一個(gè)'\0'。
?3.
int main() {char arr1[15] = "abcdef\0xxxxxx";char arr2[] = "abcd";strncat(arr1, arr2, 6);printf("%s\n", arr1);return 0; }? 如果源字符串的長(zhǎng)度小于num,則就只追加完源字符串,再補(bǔ)上一個(gè)'\0'就結(jié)束了
4.
int main() {char arr[10] = "abc";strncat(arr, arr, 3);return 0; }?用該函數(shù)自己給自己追加是安全的
模擬實(shí)現(xiàn):?
創(chuàng)建一個(gè)my_strncat函數(shù),模擬實(shí)現(xiàn)strcat函數(shù)的功能:
char* my_strncat(char* dest, const char* src, size_t num) {assert(dest && src);char* ret = dest; //上面的代碼與前一個(gè)模擬實(shí)現(xiàn)的函數(shù)原因相同,這里就不多贅述了while (*dest != '\0') //找到dest指針指向的字符串的末尾的'\0'dest++;while (num--) //控制追加幾個(gè)字節(jié){*dest = *src; //追加if (*src == '\0') //若src指向'\0',就直接返回終止函數(shù),此時(shí)'\0'已經(jīng)追加完成了return ret;dest++; //++,指向下一個(gè)字符src++; //++,指向下一個(gè)字符}*dest = '\0'; //追加完成后再在最后追加一個(gè)'\0'return ret; //返回字符串的起始地址 } int main() {char arr1[15] = "abcdef\0xxxxxx";char arr2[] = "1234";printf("%s\n", my_strncat(arr1, arr2, 3));return 0; }3.strncmp
?該函數(shù)包含三個(gè)參數(shù),前兩個(gè)參數(shù)與上一篇文章中講解的strcmp函數(shù)一樣,一個(gè)目的地,一個(gè)源,第三個(gè)為要比較的字節(jié)數(shù) (注意這里是字節(jié)數(shù)!)
返回值為int類(lèi)型,與strcmp函數(shù)一樣,
第一個(gè)字符串大于第二個(gè)字符串,則返回大于0的數(shù)字
第一個(gè)字符串等于第二個(gè)字符串,則返回0
第一個(gè)字符串小于第二個(gè)字符串,則返回小于0的數(shù)字
?重點(diǎn):
比較到出現(xiàn)另個(gè)字符不一樣或者一個(gè)字符串結(jié)束或者num個(gè)字符全部比較完。
?1. 當(dāng)兩個(gè)字符串前num個(gè)字符相等時(shí)
?2. 當(dāng)前一個(gè)字符串大于后者時(shí)
?3. 當(dāng)前一個(gè)字符串小于后者時(shí)
?模擬實(shí)現(xiàn):
創(chuàng)建一個(gè)my_strncmp函數(shù),模擬實(shí)現(xiàn)strncmp函數(shù)的功能:
int my_strncmp(const char* str1, const char* str2, size_t num) {assert(str1 && str2); //上面的代碼與前一個(gè)模擬實(shí)現(xiàn)的函數(shù)原因相同,這里就不多贅述了while (num--) //控制比較的字節(jié)數(shù){if (*str1 == *str2) //比較字符{if (*str1 == '\0')//判斷是否已經(jīng)比較到了末尾,若為'\0'則表示兩字符串相等return 0;str1++;str2++;}elsereturn *str1 - *str2;//若兩字符不同就直接返回兩字符差值}return 0; //若能走到這就說(shuō)明兩字符串所比較的這幾個(gè)字節(jié)的字符時(shí)相同的 } int main() {char arr1[] = "abcdef";char arr2[] = "abccdg";printf("%d\n", my_strncmp(arr1, arr2, 4));return 0; }寫(xiě)在最后:
本節(jié)內(nèi)容已經(jīng)講完,下篇會(huì)繼續(xù)講解字符串相關(guān)函數(shù),期待圍觀學(xué)習(xí)!!!
總結(jié)
以上是生活随笔為你收集整理的赶紧来修炼内功~字符串函数详解大全(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 聊聊soho办公-人们为什么越来越累
- 下一篇: python123九宫格输入_pytho