C语言字符函数和字符串函数详解:从基础到实战

在 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 语言的编程之旅中探索更多宝藏知识!​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值