C语言字符函数
字符函數 《string.h》
- 無字符串長度限制的字符串函數
- 1. strlen 計算字符串長度
- 2. strcpy 字符串拷貝
- 3. strcat 字符串追加
- 4. strcmp 字符串比較
- 有字符串長度限制的字符串函數
- 1. strncpy 字符串拷貝
- 2. strncat 字符串追加
- 3. strncmp 字符串比較
- 4. strstr 在字符串中查找另一字符串
- 5. strtok 切割字符串
- 6. strerror 解析錯誤碼
- perror 解析錯誤碼,打印信息
- 字符操作函數
- 1. `isdigit` 判斷是否是數字字符
- 2. islower 判斷是否是小寫字符
- 字符轉換函
- tolower 字符轉小寫
- toupper 字符轉大寫
無字符串長度限制的字符串函數
1. strlen 計算字符串長度
strlen 函數的參數
size_t strlen ( const char * str );- strlne 是計算字符 ‘\0’ 之前所有字符的的個數,不包括 \0
- strlen 的函數返回值是 unsigned int 類型,無符號整形
- strlen 的參數指向的字符串的結尾必須包涵 \0,字符串是以 \0作為結束標志
strlen 的使用方法
#include<string.h> int main() {char arr[] = { "abcde" };int n = strlen(arr);int i = 0;for (i = 0; i < n; i++){printf("%c ", arr[i]);}return 0; }關于 strlen 函數的返回值是size_t,也就是uisigned int 的例題
int main() {const char* n = "abcdef";const char* x = "abx";if (strlen(x) - strlen(n) > 0){printf("x > n\n");}else{printf("n > x\n");}return 0; }- 題解
上面的例題中,n的字符串個數是 6,x 的字符串個數是 3
3 - 6 = -3
正常的結果是 n > x
但是之前說過 strlen函數的返回的是 size_t,是無符號的
-3 如果被當成無符號數來解讀的話,那就沒有符號位的概念了
-3 就會被解讀成一個超級大的正數,就會大于 0
結果: x > n
2. strcpy 字符串拷貝
strcpy 函數的參數
char* strcpy(char * destination, const char * source );- strcpy 字符串拷貝的源字符串必須以 \0 為結束標志
- strcpy 會將源字符串中的 ‘\0’ 拷貝到目標空間中
- 拷貝的目標空間必須足夠大,拷貝后能夠存放字符串
- strcpy 拷貝的字符串必須是可改變的,不能是常量字符串
strcpy 函數的使用
strcpy 里的第一個參數是拷貝的目標空間,第二個參數是拷貝的內容
3. strcat 字符串追加
strcat 函數的參數
char * strcat ( char * destination, const char * source );strcat 字符串追加,是在字符串 A 后面在追加一個字符串 B
- strcat 的源字符串必須以 \0 為結束標志
- strcat 的被追加的空間必須能夠存放的下追加的字符串
- strcat 的源字符串必須是可改變的,不能是常量字符串
strcat 函數的使用
int main() {char arr[20] = { "hello " };char arr2[] = "china";strcat(arr, arr2);printf("%s\n", arr);return 0; }- strcat 函數追加會把 arr2 的所有字符串拷貝到arr1里,包括\0
- arr2拷貝時會把arr1 里的\0 覆蓋,所以 strcat 函數不能 字符串A 追加 字符串A
4. strcmp 字符串比較
strcmp 函數的參數
int strcmp ( const char * str1, const char * str2 );-
strcmp函數的判斷標準規定:
第一個字符串大于第二個字符串,則返回大于0的數字
第一個字符串等于第二個字符串,則返回0
第一個字符串小于第二個字符串,則返回小于0的數字 -
strcmp 是比較每個字符串的第一個字符, 如果相等,
則繼續比較下一對字符,直到字符不相等或到達終止空字符
strcmp 函數使用
int main() {char arr[] = { "abcdefg" };char str[] = { "abg" };int ret = strcmp(arr, str);if (ret > 0)printf("arr > str");else if (ret < 0)printf("arr < str");elseprintf("arr == str");return 0; }有字符串長度限制的字符串函數
1. strncpy 字符串拷貝
strncpy 函數的參數
char * strncpy ( char * destination, const char * source, size_t num );- strncpy 和 strcpy 函數的使用方法都差不多,只是多了一個參數 size_t num
- 多出來的參數是來限制字符串拷貝的長度,增加了安全性
- 如果源字符串的長度小于num,則拷貝完源字符串之后,在目標的后邊追加\0,直到num個
strncpy 函數的使用
int main() {char arr[25] = { "hello worle!" };char arr2[] = { "For a better tomorrow!########" };strncpy(arr, arr2, 22);printf("%s\n", arr);return 0; }2. strncat 字符串追加
strncat 函數參數
char * strncat ( char * destination, const char * source, size_t num );- 和 strcat 函數使用的方法和規則都差不多,只是多了一個參數 size_t num
- num 這個參數代表需要追加幾個字符串
strncat 函數使用
int main() {char arr[20] = "hello ";char* str = "world! For a better tomorrow!";strncat(arr, str, 6);printf("%s\n", arr);return 0; }3. strncmp 字符串比較
strncmp 函數參數
int strncmp ( const char * str1, const char * str2, size_t num );- 規則和 strcmp 同上
- 多出來的一個參數是用來要比較字符串的個數
strncmp 函數使用
比較3個字符串的大小
4. strstr 在字符串中查找另一字符串
strstr 函數參數
char * strstr ( const char *str1, const char * str2);- 作用:在A 字符串中查找是否包含 B字符串
如果 A 中包含 B ,則返回 B 在 A 中首次出現的的地址。
否則返回空指針! - 如果找到,返回的是字符串的地址,所以要用指針變量來接收
strstr 函數使用
int main() {char arr[] = { "abcdefg" };char str[] = { "cde" };char* ret = strstr(arr, str);if (ret == NULL)printf("沒有找到\n");elseprintf("%s\n", ret);return 0; }5. strtok 切割字符串
strtok 函數參數
char * strtok ( char * str, const char * sep );-
第一個參數是一個字符串,它包含了0個或者多個字符
-
第二個參數是分割字符串,對第一個參數的字符串掃描,碰到了分割字符串中的任意一個
就把那個字符標記成 ‘\0’ ,然后返回分割字符串之前的地址,并且保存它在字符串中的位置 -
strtok函數第二次查找的第一個參數為 NULL ,函數將在同一個字符串中被保存的位置開始,查找下一個標記
如果字符串中不存在更多的分割字符,則返回 NULL 指針。 -
strtok函數會改變被操作的字符串,所以在使用strtok函數切分的字符串一般都是臨時拷貝的內容并且可修改
strtok 函數使用
這種方法比較麻煩,而且代碼重復度高
簡化版
可以用 for 循環巧妙的達成了,結果都是一樣的
6. strerror 解析錯誤碼
strerror 函數參數
char * strerror ( int errnum );- 在使用庫函數的時候,調用庫函數失敗時,都會設置錯誤碼
- C語言中有一個全局變量叫 errno,只要調用庫函數發生錯誤,就會把錯誤碼放到errno里
- strerror 會把錯誤碼翻譯成對應的錯誤信息
- 使用必須包涵頭文件 <errno.h>
srerror的使用
返回的都是對應的錯誤信息
具體用法:
正常是 strerror 里放 errno,errno 里存放的是錯誤碼
perror 解析錯誤碼,打印信息
perror 函數參數
void perror(const char* str);- perror 的頭文件是 <stdio.h>
- perror 和 strerror 作用都是一樣的,不過strerror 沒有打印
- perror 是把錯誤碼轉換成錯誤信息,在打印
字符操作函數
| iscntrl | 任何控制字符 |
| isspace | 空白字符:空格‘ ’,換頁‘\f’,換行’\n’,回車‘\r’,制表符’\t’或者垂直制表符’\v’ |
| isdigit | 十進制數字 0~9 |
| sxdigit | 十六進制數字,包括所有十進制數字,小寫字母a ~ f,大寫字母A ~ F |
| islower | 小寫字母a~z |
| isupper | 大寫字母A~Z |
| isalpha | 字母 a ~ z 或大寫字符 A - Z |
| salnum | 字母或者數字,az,AZ,0~9 |
| ispunct | 標點符號,任何不屬于數字或者字母的圖形字符(可打印) |
| isgraph | 任何圖形字符 |
| isprint | 任何可打印字符,包括圖形字符和空白字符 |
- 以上函數的頭文件:<ctype.h>
函數使用示范:
1. isdigit 判斷是否是數字字符
int main() {char ch = '#';int ret = isdigit(ch);printf("%d\n", ret);return 0; }- 下面例題可以得知,如果是數字字符,返回的是非0的數字
- 不是數字字符,返回數字 0
答案:
2. islower 判斷是否是小寫字符
- islower 判斷是小寫字符返回的是 非0 ,不是返回 0
答案:
- 以上只是簡略的寫幾個例子,剩下的用法都是大同小異
字符轉換函
tolower 字符轉小寫
#include<ctype.h> int main() {char arr[20] = { 0 };scanf("%s", &arr);int i = 0;while (arr[i] != '\0'){if (isupper(arr[i])) //判斷是否是大寫字母{arr[i] = tolower(arr[i]);}printf("%c ", arr[i]);i++;}return 0; }toupper 字符轉大寫
int main() {char arr[20] = { 0 };scanf("%s", &arr);int i = 0;while (arr[i] != '\0'){if (islower(arr[i])) //判斷是否是小寫字母{arr[i] = toupper(arr[i]); //轉換成大寫字符}printf("%c ", arr[i]);i++;}return 0; }總結
- 上一篇: moba寻路_Dota2小技巧:从小兵仇
- 下一篇: 上海电机学院计算机类分数,2021年上海