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