字符分类函数

9个字符分类函数:

1.检查字母字符

isalpha(int c)
判断字符是否为字母(A-Z或a-z)。

示例:

char ch = 'A';
if (isalpha(ch)) {
    printf("%c 是字母\n", ch);
}
 
2.检查数字字符

isdigit(int c)
判断字符是否为数字(0-9)。
示例:

char ch = '5';
if (isdigit(ch)) {
    printf("%c 是数字\n", ch);
}
 
3.检查字母或数字字符

isalnum(int c)
判断字符是否为字母或数字(等价于 isalpha(c) || isdigit(c))。
示例:

char ch = 'a';
if (isalnum(ch)) {
    printf("%c 是字母或数字\n", ch);
}
 
4.检查空白字符

isspace(int c)
判断字符是否为空白字符(空格、制表符 \t、换行符 \n 等)。
示例:

char ch = ' ';
if (isspace(ch)) {
    printf("字符是空白符\n");
}
 
5.检查可打印字符

isprint(int c)
判断字符是否为可打印字符(ASCII 32-126,不包括控制字符)。
示例:

char ch = '#';
if (isprint(ch)) {
    printf("%c 是可打印字符\n", ch);
}
 
6.检查控制字符

iscntrl(int c)
判断字符是否为控制字符(ASCII 0-31及127)。
示例:

char ch = '\n';
if (iscntrl(ch)) {
    printf("字符是控制字符\n");
}
 
7.检查小写字母

islower(int c)
判断字符是否为小写字母(a-z)。
示例:

char ch = 'Z';
if (isupper(ch)) {
    printf("%c 是大写字母\n", ch);
}
 
8.检查标点符号

ispunct(int c)
判断字符是否为标点符号(非字母、数字、空白符的可打印字符)。
示例:

char ch = '!';
if (ispunct(ch)) {
    printf("%c 是标点符号\n", ch);
}
 
9.检查十六进制数字字符

isxdigit(int c)
判断字符是否为十六进制数字(0-9、A-F、a-f)。
示例:

char ch = 'F';
if (isxdigit(ch)) {
    printf("%c 是十六进制数字\n", ch);
}
 

注意事项

  1. 参数类型:字符分类函数的参数是 int 类型,但通常直接传入 char 类型会自动转换。
  2. EOF处理:传递 EOF(通常为-1)给这些函数会导致未定义行为。
  3. 区域设置:某些函数(如 isalpha)的结果可能受区域设置(locale)影响。

字符串函数

1.strlen函数

strlen是C语言标准库中的一个函数,用于计算字符串的长度(不包括结尾的空字符'\0')。该函数定义在头文件<string.h>中,其返回值是size_t类型的。

size_t strlen(const char *str);
 

  • 参数str是指向以空字符结尾的字符串的指针。
  • 返回值:返回字符串的长度,类型为size_t(无符号整数)。

示例:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, World!";
    size_t length = strlen(str);
    printf("Length of the string: %zu\n", length);
    return 0;
}
 

注意事项

  • 字符串必须以空字符'\0'结尾,否则strlen的行为是未定义的。
  • 如果传入空指针(NULL),程序可能会崩溃或产生不可预测的行为。

手动实现strlen函数:

第一种方法:

第二种方法:

strnlen函数概述

strnlen是C标准库中的字符串操作函数,用于计算字符串的长度,但限制在指定的最大长度范围内。与strlen不同,strnlen通过参数显式指定最大检查长度,避免潜在的缓冲区溢出风险。

size_t strnlen(const char *s, size_t maxlen);
 
  • 参数
    • s:待计算长度的字符串(需以\0结尾)。
    • maxlen:最大检查长度,函数不会检查超过此长度的字符。
  • 返回值
    • 返回字符串的实际长度(不包括\0),若未找到\0且在maxlen范围内,则返回maxlen

使用场景

  1. 安全边界检查:处理可能未终止的字符串时(如用户输入),避免strlen的越界访问。
  2. 固定缓冲区处理:已知字符串最大长度时(如网络协议字段),限制检查范围。

ps 简单理解就是在strlen的基础之上有了一个参数的限制,可以计算指定范围之内的字符串长度

    2.strcpy函数

    strcpy 是 C 语言标准库函数,用于将一个字符串复制到另一个字符串中。其函数原型为:

    char *strcpy(char *dest, const char *src);
     
    
    • dest:目标字符串的指针,需确保有足够的空间容纳源字符串(包括终止符 \0)。
    • src:源字符串的指针,必须以 \0 结尾。

    示例代码

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char src[] = "Hello, World!";
        char dest[20];
        strcpy(dest, src);
        printf("Copied string: %s\n", dest);
        return 0;
    }
     
    

    输出结果

    Copied string: Hello, World!
     
    

    注意事项

    1.目标缓冲区大小:必须确保 dest 的长度足够容纳 src 的内容,否则会导致缓冲区溢出。

    char dest[5];
    strcpy(dest, "Overflow"); // 错误:dest 空间不足
     
    

    2.安全性问题strcpy 不会检查目标缓冲区大小,推荐使用 strncpy 或非标准函数如 strlcpy(部分平台支持)。

    strncpy(dest, src, sizeof(dest) - 1);
    dest[sizeof(dest) - 1] = '\0'; // 手动添加终止符
     
    

    3.重叠内存:若 src 和 dest 内存重叠,行为未定义,应使用 memmove 代替。(memmove函数会在下一篇文章继续讲解)

    手动实现strcpy函数:

    strncpy函数

    strncpy 是 C 标准库中的字符串操作函数,用于将指定长度的字符从源字符串复制到目标字符串。其函数原型如下:

    char *strncpy(char *dest, const char *src, size_t n);
     
    
    • dest:目标字符串的指针,用于存储复制后的内容。
    • src:源字符串的指针,提供待复制的字符。
    • n:最多复制的字符数(包括终止符 \0)。

    功能特点:

    strncpy 会从 src 复制最多 n 个字符到 dest。如果 src 的长度小于 n,剩余部分会用 \0 填充;如果 src 的长度大于或等于 ndest 可能不会以 \0 结尾。

    • 复制行为
      •  src 的前 n 个字符不含 \0,则 dest 不会以 \0 结尾。
      • 若 src 长度小于 nstrncpy 会在 dest 中填充 \0 直到写入总共 n 个字符。

    示例:

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char src[] = "Hello, World!";
        char dest[20];
    
        // 复制前 5 个字符
        strncpy(dest, src, 5);
        dest[5] = '\0'; // 手动添加终止符
        printf("Partial copy: %s\n", dest); // 输出 "Hello"
    
        // 复制整个字符串(包括终止符)
        strncpy(dest, src, sizeof(src));
        printf("Full copy: %s\n", dest); // 输出 "Hello, World!"
    
        return 0;
    }
     
    

    注意事项:

    • 终止符问题strncpy 不保证目标字符串以 \0 结尾,需手动处理。
    • 缓冲区溢出:目标缓冲区 dest 必须至少能容纳 n 个字符,否则会导致未定义行为。
    • 性能与安全:相比 strcpystrncpy 更安全,但可能因填充 \0 而影响性能。
    3.strcat函数

    strcat函数的基本概念

    strcat是C语言标准库中的一个字符串操作函数,用于将源字符串(source)连接到目标字符串(destination)的末尾。该函数定义在头文件<string.h>中,函数原型如下:

    char *strcat(char *dest, const char *src);
     
    
    • dest:目标字符串,需确保有足够的空间容纳连接后的结果。
    • src:源字符串,以空字符(\0)结尾。
    • strcat会从dest字符串的终止空字符(\0)处开始,将src字符串的内容逐个字符复制到dest的末尾,直到遇到src的终止空字符。最终,dest的末尾会添加一个新的空字符。

    示例:

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char dest[20] = "Hello, ";
        const char *src = "World!";
        strcat(dest, src);
        printf("%s\n", dest); // 输出: Hello, World!
        return 0;
    }
     
    

    注意事项:

    • 目标字符串dest必须预先分配足够的空间,否则可能导致缓冲区溢出(未定义行为)。
    • destsrc不能重叠,否则结果不可预测。

    手动实现strcat函数:

    strncat函数

    strncat是C语言标准库中的一个字符串操作函数,用于将源字符串的前n个字符追加到目标字符串末尾,并确保目标字符串以空字符(\0)结尾。其原型定义在头文件<string.h>中:

    strncat函数相对于strcat函数是增加了一个参数,用来限制两个字符串连接起来的长度,更加的安全,可以避免被连接的字符串空间不够的情况。

    char *strncat(char *dest, const char *src, size_t n);
     
    
    • src的第一个字符开始,逐个复制到dest的末尾(覆盖dest原有的终止符)。
    • src的长度小于n,复制全部src内容;否则仅复制前n个字符。
    • 最终在结果字符串末尾自动添加终止符\0

    示例:

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char dest[20] = "Hello";
        char src[] = ", World!";
        strncat(dest, src, 5);  // 追加前5个字符(包括空格和逗号)
        printf("%s\n", dest);    // 输出:Hello, Wo
        return 0;
    }
     
    
    4.strcmp函数

    strcmp 是 C 语言标准库中的一个字符串比较函数,位于 <string.h> 头文件中。其功能是按字典序比较两个字符串,返回一个整数表示比较结果。

    int strcmp(const char *str1, const char *str2);
     
    
    • 返回值含义
      • 返回 0str1 和 str2 内容完全相同。
      • 返回正整数:str1 大于 str2(按 ASCII 码顺序)。
      • 返回负整数:str1 小于 str2

    示例:

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char s1[] = "apple";
        char s2[] = "banana";
        int result = strcmp(s1, s2);
        printf("比较结果: %d\n", result);  // 输出负值('a' < 'b')
        return 0;
    }
     
    

    注意事项:

    • 区分大小写strcmp 是大小写敏感的。若需忽略大小写,可使用 strcasecmp(POSIX 标准)或自定义实现。
    • 非空终止字符串风险:若字符串未以 \0 结尾,可能导致越界访问。
    • 性能:时间复杂度为 O(n),需遍历字符串直到发现差异或结束符。

    手动实现strcmp函数:

    strncmp函数

    strncmp 是 C 标准库中的一个字符串比较函数,用于比较两个字符串的前 n 个字符。其原型定义在 <string.h> 头文件中:

    int strncmp(const char *str1, const char *str2, size_t n);
     
    

    参数说明

    • str1:指向第一个字符串的指针。
    • str2:指向第二个字符串的指针。
    • n需要比较的最大字符数。

    返回值

    • 返回值为整数:
      • 若 str1 和 str2 的前 n 个字符完全相同,返回 0
      •  str1 的前 n 个字符小于 str2 的前 n 个字符(按字典序),返回负值。
      • 若 str1 的前 n 个字符大于 str2 的前 n 个字符(按字典序),返回正值。
    5.strstr函数

    strstr是C语言标准库中的一个字符串查找函数,用于在主字符串中查找子字符串的首次出现位置。

    char *strstr(const char *haystack, const char *needle);  
     
    

    参数说明

    • haystack:主字符串,即被搜索的字符串。
    • needle:子字符串,即要查找的目标字符串。

    返回值

    • 如果找到子字符串,返回指向首次出现位置的指针。
    • 如果未找到,返回NULL

    示例:

    #include <stdio.h>  
    #include <string.h>  
    
    int main() {  
        const char *haystack = "Hello, world!";  
        const char *needle = "world";  
        char *result = strstr(haystack, needle);  
    
        if (result != NULL) {  
            printf("Found: %s\n", result);  
        } else {  
            printf("Not found.\n");  
        }  
        return 0;  
    }  
     
    

    注意事项:

    • 如果needle是空字符串(""),函数会返回haystack的起始地址。
    • 区分大小写,如需不区分大小写的查找,需自行实现或使用其他库函数(如strcasestr,非标准)。
    • 使用时需确保字符串以\0结尾,否则可能导致未定义行为。

    手动实现strstr函数:

    6.strtok函数

    strtok 是 C 语言标准库中的一个字符串分割函数,位于 <string.h> 头文件中。其作用是通过指定的分隔符(delimiters)将字符串拆分为多个子串(token)。

    char *strtok(char *str, const char *delimiters);
     
    
    • str:待分割的字符串(首次调用时传入,后续调用传入 NULL)。
    • delimiters:分隔符集合,任意一个字符均会被视为分隔符。

    使用说明

    1. 首次调用:传入待分割字符串和分隔符,返回第一个子串的指针。
    2. 后续调用:传入 NULL 和相同的分隔符,继续返回后续子串。
    3. 结束条件:当无更多子串时返回 NULL

    示例:

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        char str[] = "apple,banana,cherry";
        const char *delimiters = ",";
        char *token = strtok(str, delimiters);
    
        while (token != NULL) {
            printf("%s\n", token);
            token = strtok(NULL, delimiters);
        }
        return 0;
    }
     
    

    输出

    apple  
    banana  
    cherry  
     
    

    注意事项

    • 修改原字符串strtok 会直接修改输入字符串,将分隔符替换为 \0。若需保留原字符串,应先复制一份。
    • 线程不安全strtok 使用静态缓冲区,多线程环境下应改用 strtok_r(POSIX 标准)。
    • 连续分隔符:连续的分隔符会被视为单个分隔符处理。
    7.strerror函数

    strerror 是 C 标准库(<string.h>)中用于将错误码转换为可读错误信息的函数。其原型如下:

    char *strerror(int errnum);
     
    
    • 参数errnum 为错误码(通常来自 errno 或系统调用返回值)。
    • 返回值:指向描述错误的静态字符串的指针。

    示例:

    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    
    int main() {
        errno = EACCES; // 模拟权限错误
        printf("Error: %s\n", strerror(errno));
        return 0;
    }
     
    

    注意事项:

    • 线程安全性strerror 返回的指针指向静态内存,多线程环境中可能不安全。POSIX 提供了线程安全版本 strerror_r
    • 不可修改返回值:返回的字符串为只读,修改会导致未定义行为。
    • 错误码范围:部分平台可能支持非标准错误码,但跨平台时应使用标准值(如 <errno.h> 中的定义)。
    Logo

    开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

    更多推荐