日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

赶紧来修炼内功~字符串函数详解大全(二)

發布時間:2023/12/14 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 赶紧来修炼内功~字符串函数详解大全(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

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; }

寫在最后:

本節內容已經講完,下篇會繼續講解字符串相關函數,期待圍觀學習!!!

總結

以上是生活随笔為你收集整理的赶紧来修炼内功~字符串函数详解大全(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。