【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:錯誤號,會把錯誤碼記錄到相應的錯誤號中
返回值
指向描述錯誤錯誤的錯誤字符串的指針。
代碼演示
錯誤碼會記錄到錯誤碼的變量中,比如錯誤碼變量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 | 任何可打印字符,包括圖形字符和空白字符 |
代碼演示
總結
以上是生活随笔為你收集整理的【C语言进阶】带你深度剖析那些常见的字符函数(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: App广告投放数据统计
- 下一篇: 改变图标!用户自定义列表样式css说明(