云计算百科
云计算领域专业知识百科平台

C语言初学者笔记【字符函数与字符串函数】

文章目录

  • 前言
  • 一、字符分类函数
  • 二、字符转换函数
  • 三、字符串操作函数
    • 1. `strlen` – 计算字符串长度
    • 2. `strcpy` – 字符串拷贝
    • 3. `strcat` – 字符串追加
    • 4. `strcmp` – 字符串比较
  • 四、安全长度限制函数
    • 1. `strncpy` – 限定长度拷贝
    • 2. `strncat` – 限定长度追加
    • 3. `strncmp` – 限定长度比较
  • 五、高级字符串操作
    • 1. `strstr` – 查找子串
    • 2. `strtok` – 字符串分割
    • 3. `strerror` & `perror` – 错误信息
  • 关键注意事项

前言

C语言字符与字符串函数详解 头文件依赖:<ctype.h>(字符处理)、<string.h>(字符串操作)、<errno.h>(错误码)


一、字符分类函数

int isxxx(int c); // 返回非0表示符合条件,0不符合

函数功能描述
iscntrl 检查是否为控制字符
isspace 空白字符(空格、\\n、\\t等)
isdigit 十进制数字(0-9)
isxdigit 十六进制数字(0-9、a-f、A-F)
islower 小写字母(a-z)
isupper 大写字母(A-Z)
isalpha 字母(a-z 或 A-Z)
isalnum 字母或数字
ispunct 标点符号(非数字/字母的可打印字符)
isgraph 任何图形字符
isprint 任何可打印字符(含空格)

二、字符转换函数

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写

示例:小写转大写

char str[] = "Test String.\\n";
for (int i = 0; str[i]; i++) {
if (islower(str[i]))
str[i] = toupper(str[i]); // 直接使用转换函数
putchar(str[i]);
}


三、字符串操作函数

1. strlen – 计算字符串长度

size_t strlen(const char* str);

  • 关键点:
    • 返回 \\0 前的字符数(不包含 \\0)。
    • 返回值类型 size_t(无符号整型),避免直接用于带符号运算(如 strlen(s1) – strlen(s2) > 0 可能恒成立)。

模拟实现:

// 计数器方式
size_t my_strlen(const char* str) {
size_t count = 0;
while (*str++) count++;
return count;
}

// 递归方式
size_t my_strlen(const char* str) {
return (*str == '\\0') ? 0 : 1 + my_strlen(str + 1);
}

2. strcpy – 字符串拷贝

char* strcpy(char* dest, const char* src);

  • 规则:
    • 源字符串必须以 \\0 结束。
    • 目标空间需足够大、可修改。
    • 会拷贝 \\0 到目标空间。

模拟实现:

char* my_strcpy(char* dest, const char* src) {
char* ret = dest;
while ((*dest++ = *src++)); // 包含'\\0'的拷贝
return ret;
}


3. strcat – 字符串追加

char* strcat(char* dest, const char* src);

  • 规则:
    • 源/目标字符串均需以 \\0 结束。
    • 目标空间需足够容纳合并后的内容。
    • 不可自追加(strcat(s, s) 会导致死循环)。

模拟实现:

char* my_strcat(char* dest, const char* src) {
char* ret = dest;
while (*dest) dest++; // 找到目标字符串结尾
while ((*dest++ = *src++)); // 追加源字符串
return ret;
}


4. strcmp – 字符串比较

int strcmp(const char* str1, const char* str2);

  • 返回值:
    • >0:str1 > str2
    • =0:相等
    • <0:str1 < str2
  • 比较规则:按字符ASCII码逐位比较。

模拟实现:

int my_strcmp(const char* str1, const char* str2) {
while (*str1 && *str1 == *str2)
str1++, str2++;
return *str1 *str2; // 返回差值
}


四、安全长度限制函数

1. strncpy – 限定长度拷贝

char* strncpy(char* dest, const char* src, size_t num);

  • 特点:
    • 若 src 长度 < num,剩余空间补 \\0。

2. strncat – 限定长度追加

char* strncat(char* dest, const char* src, size_t num);

  • 特点:
    • 追加后自动添加 \\0。
    • 最多追加 num 个字符(含 \\0)。

3. strncmp – 限定长度比较

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

  • 只比较前 num 个字符。

五、高级字符串操作

1. strstr – 查找子串

char* strstr(const char* str1, const char* str2);

  • 返回 str2 在 str1 中首次出现的地址,未找到返回 NULL。

模拟实现:

char* my_strstr(const char* str1, const char* str2) {
char* cp = (char*)str1;
if (!*str2) return cp;
while (*cp) {
char* s1 = cp;
char* s2 = (char*)str2;
while (*s1 && *s2 && *s1 == *s2)
s1++, s2++;
if (!*s2) return cp;
cp++;
}
return NULL;
}


2. strtok – 字符串分割

char* strtok(char* str, const char* sep);

  • 用法:
    • 首次调用:strtok(str, sep),后续调用:strtok(NULL, sep)。
    • 会修改原字符串(将分隔符替换为 \\0)。
    • 需分割临时拷贝的字符串(原字符串不可为常量)。

示例:分割IP地址

char ip[] = "192.168.1.1";
char* sep = ".";
char* token = strtok(ip, sep);
while (token) {
printf("%s\\n", token);
token = strtok(NULL, sep);
}
// 输出:192 → 168 → 1 → 1

3. strerror & perror – 错误信息

char* strerror(int errnum); // 返回错误码对应的字符串
void perror(const char* s); // 直接打印错误描述(格式:s: 错误信息)

  • 示例:

FILE* fp = fopen("nonexist.txt", "r");
if (!fp) {
perror("File open failed");
// 输出:File open failed: No such file or directory
}


关键注意事项

  • 字符函数:依赖 <ctype.h>,参数为 int 类型(可传 char)。
  • 字符串函数:
    • 操作以 \\0 结尾的字符串。
    • 确保目标空间足够大、可修改。
    • 避免无长度检查的函数(如 strcpy、strcat),优先使用安全版本(strncpy、strncat)。
  • 错误处理:
    • 使用 strerror 或 perror 结合 errno 诊断问题。
  • 性能:strlen 时间复杂度为 O(n),避免在循环中重复调用。
  • 建议结合代码实践加深理解!

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » C语言初学者笔记【字符函数与字符串函数】
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!