在 C 语言的编程世界里,字符和字符串的处理是家常便饭,为了让大家能轻松搞定这些操作,C 标准库提供了超多实用的字符和字符串函数。今天,我就来给大家一一介绍这些函数,从最基础的字符分类函数,到常用的字符串操作函数,不仅讲怎么用,还带你亲手模拟实现它们,新手友好,保证让你学完就能上手!
字符分类函数:认识字符的“身份”
字符分类函数就像给字符做身份鉴定,看看它是字母、数字,还是其他啥类型的字符。它们都藏在`ctype.h`这个头文件里。
1. isalpha:判断是不是字母。
• 用法:`int isalpha(int c);`
• 参数 c 是一个字符(会自动转成 int 类型)。
• 如果 c 是字母(a-z 或 A-Z),返回非零值(表示真);否则返回 0(假)。
#include <stdio.h>
#include <ctype.h>
int main() {
char ch = 'A';
if (isalpha(ch)) {
printf("%c 是字母\n", ch);
} else {
printf("%c 不是字母\n", ch);
}
return 0;
}
2. isdigit:判断是不是数字字符(0-9)。
• 用法:`int isdigit(int c);`
• 参数 c 是一个字符(会自动转成 int 类型)。
• 如果 c 是数字字符,返回非零值;否则返回 0。
#include <stdio.h>
#include <ctype.h>
int main() {
char ch = '5';
if (isdigit(ch)) {
printf("%c 是数字\n", ch);
} else {
printf("%c 不是数字\n", ch);
}
return 0;
}
字符转换函数:字符的“变身术”
字符转换函数能帮字符“变身”,比如把大写字母变小写,小写字母变大写,都在`ctype.h`头文件里。
1. tolower:把字符转成小写。
• 用法:`int tolower(int c);`
• 参数 c 是一个字符(会自动转成 int 类型)。
• 如果 c 是大写字母(A-Z),返回对应的小写字母;否则原样返回。
#include <stdio.h>
#include <ctype.h>
int main() {
char ch = 'B';
printf("转换后:%c\n", tolower(ch));
return 0;
}
2. toupper:把字符转成大写。
• 用法:`int toupper(int c);`
• 参数 c 是一个字符(会自动转成 int 类型)。
• 如果 c 是小写字母(a-z),返回对应的大写字母;否则原样返回。
#include <stdio.h>
#include <ctype.h>
int main() {
char ch = 'c';
printf("转换后:%c\n", toupper(ch));
return 0;
}
strlen 使用和模拟实现:测测字符串有多长
1. strlen 的使用:`strlen`函数是用来计算字符串的长度,它会从字符串的开头一直数到遇到终止符`\0`为止。
• 用法:`size_t strlen(const char *str);`
• 参数 str 是一个指向字符串的指针。
• 返回值是 size_t 类型(无符号整数类型),表示字符串的长度(不包括`\0`)。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello";
printf("字符串长度:%zu\n", strlen(str));
return 0;
}
2. strlen 的模拟实现:我们可以自己写一个函数来实现 strlen 的功能。
• 思路:遍历字符串,遇到`\0`就停下,记录遍历的次数就是字符串长度。
#include <stdio.h>
size_t my_strlen(const char *str) {
size_t length = 0;
while (*str != '\0') {
length++;
str++;
}
return length;
}
int main() {
char str[] = "hello";
printf("字符串长度:%zu\n", my_strlen(str));
return 0;
}
strcpy 使用和模拟实现:复制字符串
1. strcpy 的使用:`strcpy`函数能把一个字符串的内容复制到另一个字符串空间里。
• 用法:`char *strcpy(char *dest, const char *src);`
• 参数 dest 是目标字符串的指针,src 是源字符串的指针。
• 返回值是 dest。
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "hello";
char dest[10];
strcpy(dest, src);
printf("复制后的字符串:%s\n", dest);
return 0;
}
2. strcpy 的模拟实现:自己动手实现 strcpy。
• 思路:逐个字符复制,从源字符串复制到目标字符串,直到遇到`\0`。
#include <stdio.h>
char *my_strcpy(char *dest, const char *src) {
char *temp = dest;
while (*src != '\0') {
*dest = *src;
dest++;
src++;
}
*dest = '\0'; // 添加字符串结束符
return temp;
}
int main() {
char src[] = "hello";
char dest[10];
my_strcpy(dest, src);
printf("复制后的字符串:%s\n", dest);
return 0;
}
strcat 使用和模拟实现:连接字符串
1. strcat 的使用:`strcat`函数能把一个字符串连接到另一个字符串的后面。
• 用法:`char *strcat(char *dest, const char *src);`
• 参数 dest 是目标字符串的指针,src 是源字符串的指针。
• 返回值是 dest。
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "hello ";
char src[] = "world";
strcat(dest, src);
printf("连接后的字符串:%s\n", dest);
return 0;
}
2. strcat 的模拟实现:自己实现 strcat。
• 思路:找到目标字符串的结尾,然后从源字符串开始复制,直到遇到`\0`。
#include <stdio.h>
char *my_strcat(char *dest, const char *src) {
char *temp = dest;
// 找到 dest 的结尾
while (*dest != '\0') {
dest++;
}
// 复制 src 到 dest 的结尾
while (*src != '\0') {
*dest = *src;
dest++;
src++;
}
*dest = '\0'; // 添加字符串结束符
return temp;
}
int main() {
char dest[20] = "hello ";
char src[] = "world";
my_strcat(dest, src);
printf("连接后的字符串:%s\n", dest);
return 0;
}
strcmp 使用和模拟实现:比较字符串
1. strcmp 的使用:`strcmp`函数能比较两个字符串的大小关系。
• 用法:`int strcmp(const char *str1, const char *str2);`
• 参数 str1 和 str2 是两个字符串的指针。
• 返回值:
• 如果 str1 和 str2 相等,返回 0。
• 如果 str1 小于 str2,返回负数。
• 如果 str1 大于 str2,返回正数。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "banana";
int result = strcmp(str1, str2);
if (result == 0) {
printf("两个字符串相等\n");
} else if (result < 0) {
printf("%s 小于 %s\n", str1, str2);
} else {
printf("%s 大于 %s\n", str1, str2);
}
return 0;
}
2. strcmp 的模拟实现:自己写 strcmp 函数。
• 思路:逐个字符比较,遇到不同的字符就返回它们的差值,如果全部相同就返回 0。
#include <stdio.h>
int my_strcmp(const char *str1, const char *str2) {
while (*str1 == *str2) {
if (*str1 == '\0') { // 两个字符串都结束
return 0;
}
str1++;
str2++;
}
return *(unsigned char *)str1 - *(unsigned char *)str2;
}
int main() {
char str1[] = "apple";
char str2[] = "banana";
int result = my_strcmp(str1, str2);
if (result == 0) {
printf("两个字符串相等\n");
} else if (result < 0) {
printf("%s 小于 %s\n", str1, str2);
} else {
printf("%s 大于 %s\n", str1, str2);
}
return 0;
}
strncpy 函数的使用:复制指定长度的字符串
1. strncpy 的使用 : strncpy 函数能复制指定长度的字符串。
用法: char *strncpy(char *dest, const char *src, size_t n);
参数 dest 是目标字符串的指针,src 是源字符串的指针,n 是要复制的最大字符数。
返回值是 dest。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "hello world";
char dest[10];
strncpy(dest, src, 5); // 复制前 5 个字符
dest[5] = '\0'; // 手动添加字符串结束符
printf("复制后的字符串:%s\n", dest);
return 0;
}
strncat 函数的使用:连接指定长度的字符串
1. strncat 的使用 : strncat 函数能把一个字符串的前 n 个字符连接到另一个字符串的后面。
用法: char *strncat(char *dest, const char *src, size_t n);
参数 dest 是目标字符串的指针,src 是源字符串的指针,n 是要连接的最大字符数。
返回值是 dest。
示例:#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "hello ";
char src[] = "world";
strncat(dest, src, 3); // 连接前 3 个字符
printf("连接后的字符串:%s\n", dest);
return 0;
}
strncmp 函数的使用:比较指定长度的字符串
1. strncmp 的使用 : strncmp 函数能比较两个字符串的前 n 个字符。
用法: int strncmp(const char *str1, const char *str2, size_t n);
参数 str1 和 str2 是两个字符串的指针,n 是要比较的最大字符数。
返回值:如果两个字符串的前 n 个字符相等,返回 0。如果 str1 小于 str2,返回负数。如果 str1 大于 str2,返回正数。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "app";
int result = strncmp(str1, str2, 3);
if (result == 0) {
printf("两个字符串的前 3 个字符相等\n");
} else if (result < 0) {
printf("%s 的前 3 个字符小于 %s 的前 3 个字符\n", str1, str2);
} else {
printf("%s 的前 3 个字符大于 %s 的前 3 个字符\n", str1, str2);
}
return 0;
}
strstr 的使用和模拟实现:查找子字符串
1. strstr 的使用 : strstr 函数能在字符串中查找子字符串。
用法: char *strstr(const char *haystack, const char *needle);
参数 haystack 是要搜索的主字符串,needle 是要查找的子字符串。
返回值:如果找到子字符串,返回子字符串在主字符串中的第一个字符的指针。如果没找到,返回 NULL。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello world";
char *substr = strstr(str, "world");
if (substr != NULL) {
printf("找到子字符串:%s\n", substr);
} else {
printf("未找到子字符串\n");
}
return 0;
}
2. strstr 的模拟实现 :自己写 strstr 函数。
思路:遍历主字符串,逐个字符开始匹配子字符串。
示例代码:
#include <stdio.h>
char *my_strstr(const char *haystack, const char *needle) {
size_t needle_len = my_strlen(needle);
if (needle_len == 0) {
return (char *)haystack; // 空字符串总是在任何字符串中
}
size_t haystack_len = my_strlen(haystack);
for (size_t i = 0; i <= haystack_len - needle_len; i++) {
const char *p = haystack + i;
const char *q = needle;
while (*p == *q && *q != '\0') {
p++;
q++;
}
if (*q == '\0') { // 找到匹配
return (char *)(haystack + i);
}
}
return NULL; // 未找到
}
int main() {
char str[] = "hello world";
char *substr = my_strstr(str, "world");
if (substr != NULL) {
printf("找到子字符串:%s\n", substr);
} else {
printf("未找到子字符串\n");
}
return 0;
}
strtok 的使用:分解字符串
1. strtok 的使用 : strtok 函数能根据指定的分隔符分解字符串。
用法: char *strtok(char *str, const char *delimiters);
参数 str 是要分解的字符串(第一次调用时传递,后续调用传 NULL),delimiters 是分隔符字符串。
返回值:成功分解出一个子字符串,返回该子字符串的指针。如果整个字符串分解完毕,返回 NULL。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello,world,this,is,a,test";
char *token = strtok(str, ",");
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ",");
}
return 0;
}
strerror 函数的使用:获取错误信息字符串
1. strerror 的使用 : strerror 函数能根据错误码获取对应的错误信息字符串。
用法: char *strerror(int errnum);
参数 errnum 是错误码。
返回值:返回对应错误信息的字符串。
示例:
#include <stdio.h>
#include <string.h>
int main() {
int errnum = 2; // 一般 2 对应 "No such file or directory"
printf("错误信息:%s\n", strerror(errnum));
return 0;
}
总结
今天,咱们把 C 语言里超实用的字符分类函数和字符串函数一网打尽啦!从字符分类函数的字符身份鉴定,到字符串函数的各种操作,包括 strlen、strcpy、strcat、strcmp 等经典函数的使用和模拟实现,还拓展了 strncpy、strncat、strncmp、strstr、strtok、strerror 等函数的用法。新手友好,这些函数在日常编程里超常用,学会它们,字符串处理不再是难题!希望大家能多练练,把每个函数都玩得明明白白。
宝子们,今天的内容是不是让你对 C 语言的字符和字符串函数有了全新的认识?有没有哪个函数的模拟实现让你眼前一亮,或者曾经困扰你的地方现在豁然开朗?快来评论区分享你的学习心得或者疑问吧!说不定你的分享就能帮到其他小伙伴,大家一起进步,下次咱们继续在 C 语言的编程之旅中探索更多宝藏知识!