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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【C语言进阶】带你深度剖析那些常见的字符函数(一)

發布時間:2023/12/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言进阶】带你深度剖析那些常见的字符函数(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在C語言的學習中,C語言中對字符和字符串的處理很是頻繁,所以今天本文是針對有關字符串的函數進行深度剖析,下面我會介紹函數的功能,如何使用,參數,模擬實現等方面來進行講述,希望本文對你有所幫助。

目錄

  • 前言
  • 1.長度不受限制的字符串函數
    • 1.1strlen
      • strlen函數使用介紹
      • strlen函數模擬實現
    • 1.2 strcpy
      • strcpy函數使用介紹
      • strcpy函數模擬實現
    • 1.3 strcat
      • strcat函數使用介紹
      • strcat函數模擬實現
    • 1.4 strcmp
      • strcmp函數使用介紹
      • strcmp函數模擬實現
  • 2.長度受限制的字符串函數
    • 2.1strncpy
      • strncpy函數使用介紹
      • strncpy函數模擬實現
    • 2.2 strncat
      • strncat函數使用介紹
      • strncat函數模擬實現
    • 2.3 strncmp
      • strncmp函數使用介紹
      • strncmp函數模擬實現
  • 3.字符串查找
    • 3.1 strstr
      • strstr函數使用介紹
      • strstr函數模擬實現
    • 3.2 strtok
      • strtok函數使用介紹
  • 4.錯誤信息查找
    • 4.1strerror
      • strerror函數使用介紹
  • 5.字符分類函數

1.長度不受限制的字符串函數

1.1strlen

strlen函數使用介紹

size_t strlen ( const char * str );

返回值+函數名+參數構成函數聲明

strlen計算的是字符串的長度,字符串已經 ‘\0’ 作為結束標志,strlen函數返回的是在字符串中 ‘\0’ 前面出現的字符個數(不包含 ‘\0’ )。
參數指向的字符串必須要以 ‘\0’ 結束。
注意函數的返回值為size_t,是無符號的( 易錯 )

代碼演示

#include<stdio.h> #include<string.h> int main() {char arr[] = "abcdef";int ret = strlen(arr);printf("%d\n", ret);return 0; }

strlen函數模擬實現

#include<assert.h> int 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[] = "abcdef";int len = my_strlen(arr);printf("%d\n", len);return 0; }

1.2 strcpy

strcpy函數使用介紹

char * strcpy ( char * destination, const char * source );

strcpy功能:
將源頭空間(source)的字符串拷貝到目的地空間(destination)中
源字符串必須以 ‘\0’ 結束。
會將源字符串中的 ‘\0’ 拷貝到目標空間。
目標空間必須足夠大,以確保能存放源字符串。
目標空間必須可修改,注意常量字符串不可修改
參數
destination:指向要在其中復制內容的目標數組的指針
source:要拷貝的源頭字符串。

返回值
返回目標空間中字符串起始地址

代碼演示

#include<stdio.h> #include<string.h> int main() {char arr[10] = "xxxxxxxxxx";//目標空間const char* p = "abcdef";//要拷貝的字符串strcpy(arr, p);//使用函數進行拷貝printf("%s\n", arr);return 0; }

strcpy函數模擬實現

#include<assert.h> char* my_strcpy(char* dest, const char* src) {assert(dest);//防止dest和src為空指針assert(src);char* ret = dest;//將dest的起始地址放在ret中while (*dest++ = *src++){;}return ret;//返回目標空間的起始地址 } int main() {char arr[20] = "abc";char arr2[] = "hello world";my_strcpy(arr, arr2);printf("%s\n", arr);return 0; }

1.3 strcat

strcat函數使用介紹

char * strcat ( char * destination, const char * source );

功能
將源空間中的字符串追加到目的地空間中,源空間的字符串從目的空間字符串的\0的位置開始追加
比如char arr1[10]=“hello” char arr2[]=“world”,將arr2的字符串追加到arr1中,最終為"hello world",在什么時候追加呢,在arr1的’\0’的位置開始進行追加
源字符串必須以 ‘\0’ 結束。
目標空間必須有足夠的大,能容納下源字符串的內容。
目標空間必須可修改。
參數
destination:目標空間
source:源頭空間
返回值
返回目標空間中字符串起始地址

代碼演示

#include<stdio.h> #include<string.h> int main() {char arr1[20] = "hello ";char arr2[] = "world";strcat(arr1, arr2);printf("%s\n", arr1);return 0; }

strcat函數模擬實現

#include<stdio.h> #include<assert.h> char* my_strcat(char* dest, const char* src) {assert(dest);assert(src);//找到目標空間的\0char* ret = dest;while (*dest != '\0'){dest++;}//在將源空間的字符串拷貝到\0以后的空間中while (*dest++ = *src++){;}return ret; } int main() {char arr1[20] = "hello \0xxxxxxxxx";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0; }

1.4 strcmp

strcmp函數使用介紹

int strcmp ( const char * str1, const char * str2 );

功能
將 字符串 str1 與 字符串 str2 進行比較,比較對應位置的字符大小。
函數開始比較每個字符串的第一個字符。如果它們彼此相等,則繼續執行以下對操作,直到字符不同或達到終止空字符。

參數
str1:要比較的 C字符串str1
str2:要比較的 C字符串str2

返回值
返回一個整數值,該值指示字符串之間的關系:

返回值表明
<第一個不匹配的字符在 str1 中的值低于 str2 中的值
>第一個不匹配的字符在str1 中的值大于 str2 中的值
=兩個字符串的內容相等

如果str1中的值低于str2,返回一個小于0的數,str1>str2,返回一個大于0的數,相等就返回0.

代碼演示

#include<stdio.h> #include<string.h> int main() {char arr1[] = "abcdef";//第三個字符'c'小于arr2中的'd'char arr2[] = "abd";//所以返回一個小于0的數字int ret=strcmp(arr1, arr2);printf("%d\n", ret);return 0; }

strcmp函數模擬實現

#include<assert.h> int my_strcmp(const char* str1, const char* str2) {assert(str1);assert(str2);while (*str1 == *str2){if (*str1 == '\0')//這個判斷表明前面字符比較都是相同的{return 0;}str1++;str2++;}return *str1 - *str2; } int main() {char arr1[] = "abc";char arr2[] = "abd";int ret = my_strcmp(arr1, arr2);if (ret < 0)printf("arr1<arr2\n");else if (ret > 0)printf("arr1>arr2\n");elseprintf("arr1=arr2\n");printf("%d\n", ret);return 0; }

2.長度受限制的字符串函數

2.1strncpy

strncpy函數使用介紹

char * strncpy ( char * destination, const char * source, size_t num );

功能
拷貝num個字符從源字符串到目標空間。
如果源字符串的長度小于num,則拷貝完源字符串之后,在目標的后邊追加0,直到num個,前提是要保證目標空間可以存放。

參數
destination:指向要在其中復制內容的目標數組的指針
source:要拷貝的源頭字符
size_t num:要從源復制的最大字符數。size_t是無符號整數類型。

返回值
返回目標空間中字符串起始地址

代碼演示

#include<stdio.h> #include<string.h> int main() {char arr1[20] = "abcdef";char arr2[] = "xxxxx";strncpy(arr1, arr2, 4);printf("%s\n", arr1);return 0; }

strncpy函數模擬實現

#include<assert.h> char* my_strncpy(char* dest, const char* src, int num) {assert(dest && src);char* ret = dest;while (num&&(*dest++ = *src++)!='\0'){num--;}while (num){num--;*dest++ = '\0';}return ret; } int main() {char arr1[20] = "abcdefg";char arr2[] = "xxxxx";my_strncpy(arr1, arr2, 5);printf("%s\n", arr1);return 0; }

2.2 strncat

strncat函數使用介紹

char * strncat ( char * destination, const char * source, size_t num );

功能
將源頭空間的前 num 個字符追加到目標,從目標空間的\0開始追加,外加一個終止空字符\0。
如果源頭中 C 字符串的長度小于 num,則僅復制到終止空字符之前的內容。
參數
destination:指向要在其中復制內容的目標數組的指針
source:要追加的源頭字符
size_t num:要從源頭追加的最大字符數。size_t是無符號整數類型。

返回值
返回目標空間中字符串起始地址

代碼演示

#include<stdio.h> #include<string.h> int main() {char arr1[20] = "abcdefd\0xxxxx";char arr2[] = "xyz";strncat(arr1, arr2, 2);printf("%s\n", arr1);return 0; }

strncat函數模擬實現

#include<stdio.h> #include<assert.h> char *my_strncat(char* dest, const char* src, int num) {assert(dest&& src);char* ret = dest;//找到目標空間的\0while (*dest != '\0'){dest++;}while (num&&(*dest++ = *src++)!='\0'){num--;}*dest = '\0';return ret;} int main() {char arr1[20] = "abcdef";char arr2[] = "xxxx";my_strncat(arr1, arr2, 2);printf("%s\n", arr1);return 0; }

2.3 strncmp

strncmp函數使用介紹

int strncmp ( const char * str1, const char * str2, size_t num );

功能

將 字符串 str1 與 字符串 str2前num個字符進行比較,比較對應位置的字符大小。
函數開始比較每個字符串的第一個字符。如果它們彼此相等,則繼續執行以下對操作,直到執行完num個字符
參數
str1:要比較的字符串str1
str2:要比較的字符串str2
size_t num:要比較的最大字符數,size_t是無符號整數類型。

返回值
返回一個整數值,該值指示字符串之間的關系:

返回值表明
<第一個不匹配的字符在 str1 中的值低于 str2 中的值
>第一個不匹配的字符在str1 中的值大于 str2 中的值
=兩個字符串的內容相等

如果str1中的值低于str2,返回一個小于0的數,str1>str2,返回一個大于0的數,相等就返回0.

代碼演示

#include<stdio.h> #include<string.h> int main() {char arr1[20] = "abcdef";char arr2[] = "abd";int ret = strncmp(arr1, arr2, 3);printf("%d\n", ret);return 0; }


我們只需要比較兩個字符串的前三個字符的大小,明顯從c字符<d字符,所以趕回一個小于0的數。

strncmp函數模擬實現

#include<stdio.h> #include<assert.h> int my_strncmp(const char* str1, const char* str2, int num) {assert(str1 && str2);while (num && (*str1 == *str2)){if (*str1 == '\0'){return 0;}str1++;str2++;num--;}return *str1 - *str2; } int main() {char arr1[20] = "abcdef";char arr2[] = "abd";int ret = my_strncmp(arr1, arr2, 3);printf("%d\n", ret);return 0; }

3.字符串查找

3.1 strstr

strstr函數使用介紹

char * strstr ( char * str1, const char * str2 );

功能
找一個字符串在另一個字符串中是否存在
如果存在,返回子串第一次出現的位置的地址,不存在返回NULL

參數
str1:要掃描的 C 字符串
str2:包含要匹配的字符序列的 C 字符串

返回值
指向 str2 中指定的整個字符序列中 str1 中第一個出現的指針,如果 str1 中不存在該序列,則為空指針。

代碼演示

#include<stdio.h> #include<string.h> int main() {char arr1[20] = "abcdef";char arr2[] = "bc";char* p = strstr(arr1, arr2);if (p == NULL){printf("不存在");}else{printf("%s\n", p);}return 0; }

strstr函數模擬實現

#include<stdio.h> #include<assert.h> char* my_strstr(char* str1, const char* str2) {//先找到字符標記號char* cp = str1;char* s1, * s2;if (!*str2){return((char*)str1);}while (*cp){s1 = cp;s2 = (char*)str2;while (*s2 && !(*s1 - *s2)){s1++, s2++;}if (!*s2){return(cp);}cp++;}return(NULL); } int main() {char arr1[20] = "abcdef";char arr2[] = "bc";char* p = my_strstr(arr1, arr2);if (p == NULL){printf("不存在");}else{printf("%s\n", p);}return 0; }

3.2 strtok

strtok函數使用介紹

char * strtok ( char * str, const char * delimiters );

功能
strtok函數找到str中的下一個標記,并將其用 \0 結尾,返回一個指向這個標記的指針。(注:
strtok函數會改變被操作的字符串,所以在使用strtok函數切分的字符串一般都是臨時拷貝的內容
并且可修改。)
strtok函數的第一個參數不為 NULL ,函數將找到str中第一個標記,strtok函數將保存它在字符串
中的位置。
第二次調用strtok函數時,第一個參數為 NULL ,函數將在同一個字符串中被保存的位置開始,查找下一個標
記。如果字符串中不存在更多的標記,則返回 NULL 指針。

參數
str:第一個參數指定一個字符串,它包含了0個或者多個由sep字符串中一個或者多個分隔符分割的標
記。
delimiters:delimiters參數是個字符串,定義了用作分隔符的字符標記集合

返回值
如果找到分隔符,則返回為指向該字符串開頭的指針。否則,為空指針。
當在掃描的字符串中達到字符串的末尾(即空字符)時,始終返回空指針。

代碼演示

#include<stdio.h> #include<string.h> int main() {char arr[20] = "sjjjjska@biid.com";char buf[200] = { 0 };strcpy(buf, arr);//將arr的字符串拷貝到buf中const char* p = "@.";//標記字符串char* str = strtok(buf, p);//第一個參數是非NULL,//函數將找到buf中第一個標記@,將其用\0覆蓋,strtok函數將保存@在字符串中的位置。//然后strtok返回sjjjjska的首字符地址,存放在str中,%s打印出printf("%s\n", str);str = strtok(NULL, p);//第二次調用strtok時,第一個參數是NULL//strtok函數將在上一次保存的位置處,繼續查找,將其標記符用\0進行覆蓋,又將保存標記字符的地址//返回biil首字符的地址。printf("%s\n", str);str = strtok(NULL, p);//在上一次位置再次進行查找printf("%s\n", str);//如果再次調用strtok函數時,返回空指針return 0; }

4.錯誤信息查找

4.1strerror

strerror函數使用介紹

char * strerror ( int errnum );

功能
把錯誤碼轉換成錯誤信息
參數
errnum:錯誤號,會把錯誤碼記錄到相應的錯誤號中
返回值
指向描述錯誤錯誤的錯誤字符串的指針。
代碼演示

#include<stdio.h> #include<string.h> int main() {printf("%s\n", strerror(0));//0,1,2,3,4就是錯誤碼printf("%s\n", strerror(1));//printf("%s\n", strerror(2));printf("%s\n", strerror(3));printf("%s\n", strerror(4));return 0; }

錯誤碼會記錄到錯誤碼的變量中,比如錯誤碼變量errno
errno的頭文件為#include<errno.h>

代碼演示

#include<stdio.h> #include<errno.h> int main() {FILE* pf = fopen("test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}//讀文件fclose(pf);pf = NULL;return 0; }


當沒有這個文件是,就會把錯誤碼記錄到錯誤變量中,在打印出來

5.字符分類函數

此類函數不做詳細介紹,感興趣的小伙伴可以自己了解一下
如何可以知道庫函數的用法點擊這里
里面有庫函數的用法,參數和返回值的講解,還有代碼演示

函數如果它的參數符合下列條件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,換頁‘\f’,換行’\n’,回車‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit十進制數字 0~9
isxdigit十六進制數字,包括所有十進制數字,小寫字母a~f,大寫字母A-F
islower小寫字母a~z
isupper大寫字母A~Z
isalpha字母a~ z或A~Z
isalnum字母或者數字,a~z ,A~ Z,0~9
ispunct標點符號,任何不屬于數字或者字母的圖形字符(可打印)
isgraph任何圖形字符
isprint任何可打印字符,包括圖形字符和空白字符

代碼演示

#include<stdio.h> #include<ctype.h> int main() {char ch = 'w';//判斷是否是數字字符int ret = isdigit(ch);//如果是非數字字符返回0printf("%d\n", ret); }

總結

以上是生活随笔為你收集整理的【C语言进阶】带你深度剖析那些常见的字符函数(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

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