-
字符串处理函数( #include
<string.h>
):strlen(str)
:返回字符串长度。
因strlen库函数返回值类型为无符号整形,当两个strlen函数值相减有时会出现问题:
无符号类型相减为负数会得到一个大的正数导致结果为‘>’,不符合预期的结果。#include <stdio.h> #include <string.h> int main() { char arr1[]="abcde"; char arr2[]="qwertyu"; printf("%u\n", strlen(arr1));//5 0101 printf("%u\n", strlen(arr2));//7 0111 1110 printf("%u\n", strlen(arr1) - strlen(arr2));//1111 1111 1111 1111 1111 1110(补码)(4294967294) printf("%d\n", strlen(arr1) - strlen(arr2));//1000 0000 0000 0000 0000 0000 0000 0010 (原码)(-2) if (strlen(arr1) - strlen(arr2) > 0) //无符号类型相减为负数会得到一个大的正数 5 - 7 = 4294967294 { printf(">\n"); } else { printf("!>\n"); } return 0; }
strcpy(dest, src)
:将源字符串复制到目标字符串。#include <stdio.h> void my_strcpy1(char* d,const char* s) { while (*s) { *d = *s; s++; d++; } *d= '\0'; } char* my_strcpy2(char* dest, const char* src) { char* ret = dest; while (*dest++ = *src++); return ret; } int main() { char arr1[] = "abcdef"; char arr2[20] = { 0 }; char arr3[20] = { 0 }; my_strcpy1(arr2, arr1); printf("%s\n", arr2); printf("%s\n", my_strcpy2(arr3, arr1)); return 0; }
strcat(dest, src)
:将源字符串添加到目标字符串的末尾。#include <stdio.h> #include <string.h> char* my_strcat(char* dest,const char* src) { char* ret = dest; while (*dest) { dest++; } while (*dest++ = *src++); return ret; } int main() { char arr1[20] = "hello "; strcat(arr1, "world!"); printf("%s\n", arr1); printf("%s\n",my_strcat(arr1," Co")); return 0; }
strcmp(str1, str2)
:比较两个字符串的内容是否相等。#include <stdio.h> #include <string.h> int my_strcmp(const char* str1,const char* str2) { while (*str1 == *str2) { if (*str1 == '\0') return 0; str1++; str2++; } return (*str1 - *str2); } int main() { char arr1[] = "adb"; char arr2[] = "adc"; int ret = strcmp(arr1, arr2); int ret1 = my_strcmp(arr1, arr2); if (ret < 0) { printf("<\n"); } else if (ret == 0) { printf("==\n"); } else { printf(">\n"); } if (ret1 < 0) { printf("<\n"); } else if (ret1 == 0) { printf("==\n"); } else { printf(">\n"); } return 0; }
strstr(str, substr)
:在字符串中查找子字符串第一次出现的位置。#include <stdio.h> char* my_strstr(const char* str1,const char* str2) { const char* s1 = str1; const char* s2 = str2; const char* p = str1; while (*p) { s1 = p; s2 = str2; while (*s1 && *s2 && *s1 == *s2) { s1++; s2++; } if (!*s2) return (char*)p; p++; } return NULL; } int main() { char str[] = "abbbcdef"; char substr[] = "bbc"; char* ret = my_strstr(str, substr); if (ret == NULL) { printf("子串不存在\n"); } else { printf("%s\n",ret); } return 0; }
- strerror(errno): 用于将
errno
的值转换为对应的错误消息字符串。#include <stdio.h> #include <string.h> #include <errno.h> int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { printf("%s\n", strerror(errno));//返回对应的错误信息 } return 0; }
- strtok(str, delimiters): 用于将字符串拆分成多个子字符串。
#include <stdio.h> #include <string.h> int main() { const char* sep = "@."; char str[] = "abc@defgh.igk.lmn"; char cp[30] = { 0 }; strcpy(cp,str); char* ret = strtok(cp, sep); while (ret != NULL) { printf("%s\n",ret); ret = strtok(NULL, sep); } return 0; }
2.字符分类函数( #include <ctype.h>
):
-
iscntrl(int c)
:- 检查字符是否为控制字符。
- 控制字符是ASCII码表中的一些特殊字符,如换行符、回车符等。
- 返回非零值(true)表示字符是控制字符,否则返回零(false)。
-
isspace(int c)
:- 检查字符是否为空白字符,包括空格、制表符、换页符等。
- 返回非零值(true)表示字符是空白字符,否则返回零(false)。
-
isdigit(int c)
:- 检查字符是否为十进制数字(0-9)。
- 返回非零值(true)表示字符是十进制数字,否则返回零(false)。
-
isxdigit(int c)
:- 检查字符是否为十六进制数字,包括十进制数字和十六进制字母(a-f、A-F)。
- 返回非零值(true)表示字符是十六进制数字,否则返回零(false)。
-
islower(int c)
:- 检查字符是否为小写字母(a-z)。
- 返回非零值(true)表示字符是小写字母,否则返回零(false)。
-
isupper(int c)
:- 检查字符是否为大写字母(A-Z)。
- 返回非零值(true)表示字符是大写字母,否则返回零(false)。
-
isalpha(int c)
:- 检查字符是否为字母(a-z 或 A-Z)。
- 返回非零值(true)表示字符是字母,否则返回零(false)。
-
isalnum(int c)
:- 检查字符是否为字母或数字。
- 返回非零值(true)表示字符是字母或数字,否则返回零(false)。
-
ispunct(int c)
:- 检查字符是否为标点符号,即不是字母或数字的可打印字符。
- 返回非零值(true)表示字符是标点符号,否则返回零(false)。
-
isgraph(int c)
:- 检查字符是否为图形字符,即可打印字符中不包括空格的字符。
- 返回非零值(true)表示字符是图形字符,否则返回零(false)。
-
isprint(int c)
:- 检查字符是否为可打印字符,包括图形字符和空白字符。
- 返回非零值(true)表示字符是可打印字符,否则返回零(false)。
#include <stdio.h> #include <ctype.h> int main() { char input_char = '9'; // 使用不同的字符分类函数来检查输入字符的类型 if (isdigit(input_char)) { printf("%c 是一个数字\n", input_char); } if (isalpha(input_char)) { printf("%c 是一个字母\n", input_char); if (islower(input_char)) { printf("%c 是一个小写字母\n", input_char); } if (isupper(input_char)) { printf("%c 是一个大写字母\n", input_char); } } if (isalnum(input_char)) { printf("%c 是一个字母或数字\n", input_char); } if (isspace(input_char)) { printf("%c 是一个空白字符\n", input_char); } if (ispunct(input_char)) { printf("%c 是一个标点符号\n", input_char); } if (isgraph(input_char)) { printf("%c 是一个图形字符\n", input_char); } if (isprint(input_char)) { printf("%c 是一个可打印字符\n", input_char); } return 0; }
字符转换函数tolower(ch),toupper(ch)
#include <stdio.h> #include <ctype.h> int main() { char ch = 'A'; printf("%c\n", tolower(ch)); printf("%c\n", toupper(ch)); return 0; }
void *memcpy(void *dest, const void *src, size_t n)用于将一块内存区域的数据复制到另一块内存区域。
#include <stdio.h> void* my_memcpy(void* dest, const void* src, size_t num) { void* ret = dest; while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return ret; } int main() { int arr1[] = { 1,2,3,4,5,6,7 }; int arr2[20] = { 0 }; int sz = sizeof(arr1); printf("%d\n", sz); my_memcpy(arr2, arr1, sz); for (int i = 0; i < sizeof(arr2) / sizeof(arr2[0]); i++) { printf("%d ", arr2[i]); } return 0; }
注意:
memcpy
函数在使用时需要确保源内存区域和目标内存区域不重叠,否则会导致拷贝的数据不正确。#include <stdio.h> void* my_memcpy(void* dest, const void* src, size_t num) { void* ret = dest; while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } return ret; } int main() { int arr1[] = { 1,2,3,4,5,6,7 }; int sz = sizeof(arr1); printf("%d\n", sz); my_memcpy(arr1 + 1, arr1, sz - 4 * 1); for (int i = 0; i < sizeof(arr1) / sizeof(arr1[0]) ; i++) { printf("%d ", arr1[i]); }//因为前一个数据覆盖了后一个数据 结果输出为全1 return 0; }
memmove
函数与memcpy
函数类似,但它能够正确处理源内存区域和目标内存区域重叠的情况。#include <stdio.h> #include <string.h> void* my_memmove(void* dest, const void* src, size_t num) { void* ret = dest; if (dest < src) { while (num--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } } else { while (num--) { *((char*)dest + num) = *((char*)src + num); } } return ret; } int main() { int arr1[8] = { 1,2,3,4,5,6,7 }; int sz = sizeof(arr1); printf("%d\n", sz); my_memmove(arr1 + 1, arr1, sz - 4 * 1); for (int i = 0; i < sizeof(arr1) / sizeof(arr1[0]) ; i++) { printf("%d ", arr1[i]); } return 0; }
memcmp 用于比较两个内存区域中的数据是否相等。
#include <stdio.h> #include <string.h> int main() { int arr1[] = { 1,2,3,4,5 }; int arr2[] = { 1,6,3 }; printf("%d\n", memcmp(arr1, arr2, 12)); return 0; }
memset
用于将一块内存区域中的内容都设置为某个特定的值。#include <stdio.h> #include <string.h> int main() { char arr[] = "hello * world!"; memset(arr+5,'#',3); printf("%s\n", arr); return 0; }