当前位置: 首页 > news >正文

【C语言】C语言中的字符函数和字符串函数全解析

前言

在C语言编程中,字符和字符串的处理是必不可少的。C语言标准库提供了丰富的字符和字符串函数,这些函数极大地简化了字符和字符串的操作。本文将详细介绍这些函数的使用方法、模拟实现以及一些实用的代码示例,帮助你更好地理解和掌握它们。

一、字符分类函数

字符分类函数用于判断字符的类型,这些函数都包含在ctype.h头文件中。例如,islower(int c)函数用于判断一个字符是否为小写字母。如果参数c是小写字母,则返回非零整数;否则返回0。
在这里插入图片描述

#include <stdio.h>
#include <ctype.h>
int main()
{int ret = islower('A');printf("%d\n", ret);ret = islower('a');printf("%d\n", ret);ret = islower('0');printf("%d\n", ret);return 0;
}

在这里插入图片描述

int main()
{int ret = isxdigit('9');printf("%d\n", ret);return 0;
}

在这里插入图片描述

示例代码:将字符串中的小写字母转换为大写

#include <stdio.h>
#include <ctype.h>
int main()
{char arr[] = "I am a Student.";int i = 0;while (arr[i] != '\0'){if (islower(arr[i])){arr[i] = arr[i] - 32;}i++;}printf("%s\n", arr);return 0;
}

在这里插入图片描述

二、字符转换函数

C语言提供了两个字符转换函数:tolower(int c)和toupper(int c)。tolower函数将大写字母转换为小写,而toupper函数将小写字母转换为大写。
示例代码:使用toupper函数将字符串中的小写字母转换为大写

#include <stdio.h>
#include <ctype.h>int main()
{char arr[] = "I am a Student.";int i = 0;while (arr[i] != '\0'){if (islower(arr[i])){arr[i] = toupper(arr[i]);}i++;}printf("%s\n", arr);return 0;
}

在这里插入图片描述

int main()
{char ch = toupper('a');printf("%c\n", ch);ch = tolower('A');printf("%c\n", ch);return 0;
}

在这里插入图片描述

int main()
{char arr[] = "I am a student.";int i = 0;while (arr[i] != '\0'){if (islower(arr[i])){arr[i] = toupper(arr[i]);}i++;}printf("%s\n", arr);return 0;
}

在这里插入图片描述

三、strlen的使用和模拟实现

strlen(const char *str)函数用于计算字符串的长度,返回字符串中’\0’之前的字符个数。需要注意的是,strlen的返回值类型是size_t,这是一个无符号类型。
示例代码:使用strlen比较两个字符串的长度

#include <stdio.h>
#include <string.h>int main()
{if (strlen("abc") - strlen("abcdef") > 0){printf(">\n");}else{printf("<\n");}
}

在这里插入图片描述
在这里插入图片描述
因为是size_t类型,所以得到的结果永远都是>=0的数

int main()
{if ((int)strlen("abc") - (int)strlen("abcdef") > 0){printf(">\n");}else{printf("<\n");}
}

在这里插入图片描述

strlen的模拟实现
方法1:计数器方式

int my_strlen(const char *str)
{int count = 0;assert(str);while (*str){count++;str++;}return count;
}

方法2:递归方式

int my_strlen(const char *str)
{assert(str);if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}

方法3:指针差值方式

#include <assert.h>size_t my_strlen(const char* str)
{const char* start = str;assert(str != NULL);while (*str != '\0'){str++;}return str - start;
}
int main()
{char arr[] = "abcdef";size_t len = my_strlen(arr);printf("%zd\n", len);return 0;
}

在这里插入图片描述

四、strcpy的使用和模拟实现

strcpy(char *destination, const char *source)函数用于将源字符串source复制到目标字符串destination中,包括终止符’\0’。目标字符串必须有足够的空间来存储源字符串。
在这里插入图片描述

#include <string.h>int main()
{char arr1[] = "hello world";char arr2[20] = { 0 };strcpy(arr2, arr1);printf("%s\n", arr2);return 0;
}

在这里插入图片描述
在这里插入图片描述

示例代码:模拟实现strcpy

#include<assert.h>char* my_strcpy(char* dest, const char* src)
{assert(dest);assert(src);char* ret = dest;while (*dest++ = *src++)//拷贝过去后,判断表达式的值,当\0拷贝过去后,停止拷贝{;}return ret;
}int main()
{char arr1[] = "abcdef";char arr2[20] = { 0 };char* pstr = my_strcpy(arr2, arr1);printf("%s\n", arr2);printf("%s\n", pstr);printf("%s\n", my_strcpy(arr2,arr1));return 0;
}

在这里插入图片描述

五、strcat的使用和模拟实现

strcat(char *destination, const char *source)函数用于将源字符串source追加到目标字符串destination的末尾。目标字符串必须有足够的空间来存储追加后的字符串。
在这里插入图片描述

#include <string.h>int main()
{char arr1[20] = "he\0lloxxxxx";char arr2[] = "world";char arr[20] = "abc";strcat(arr, arr);printf("%s\n", arr);return 0;
}

在这里插入图片描述

示例代码:模拟实现strcat

char *my_strcat(char *dest, const char *src)
{char *ret = dest;assert(dest != NULL);assert(src != NULL);while (*dest){dest++;}while ((*dest++ = *src++)){;}return ret;
}

六、strcmp的使用和模拟实现

strcmp(const char *str1, const char *str2)函数用于比较两个字符串。如果第一个字符串大于第二个字符串,则返回大于0的值;如果两个字符串相等,则返回0;如果第一个字符串小于第二个字符串,则返回小于0的值。
在这里插入图片描述

int main()
{char arr1[] = "abq";char arr2[] = "abcdef";int ret = strcmp(arr1, arr2);printf("%d\n", ret);if (ret > 0){printf(">\n");}else{printf("<\n");}return 0;
}

在这里插入图片描述

示例代码:模拟实现strcmp

int my_strcmp(const char *str1, const char *str2)
{assert(str1 != NULL);assert(str2 != NULL);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}return *str1 - *str2;
}

七、strncpy函数的使用

strncpy(char *destination, const char *source, size_t num)函数用于将源字符串的前num个字符复制到目标字符串中。如果源字符串的长度小于num,则在目标字符串的末尾填充零,直到总长度达到num。
在这里插入图片描述

int main()
{char arr1[20] = "abcdef";char arr2[20] = "xxxxxxxxxxxxxx";strncpy(arr2, arr1, 8);printf("%s\n", arr2);return 0;
}

在这里插入图片描述

八、strncat函数的使用

strncat(char *destination, const char *source, size_t num)函数用于将源字符串的前num个字符追加到目标字符串的末尾,并在末尾添加终止符’\0’。
示例代码:使用strncat

#include <stdio.h>
#include <string.h>int main()
{char str1[20];char str2[20];strcpy(str1, "To be ");strcpy(str2, "or not to be");strncat(str1, str2, 6);printf("%s\n", str1);return 0;
}

在这里插入图片描述

九、strncmp函数的使用

strncmp(const char *str1, const char *str2, size_t num)函数用于比较两个字符串的前num个字符。如果两个字符串的前num个字符相等,则返回0;否则返回非零值。
在这里插入图片描述

在这里插入图片描述

十、strstr的使用和模拟实现

strstr(const char *str1, const char *str2)函数用于查找字符串str2在字符串str1中第一次出现的位置。如果找到,则返回指向该位置的指针;否则返回空指针。
示例代码:使用strstr
在这里插入图片描述

#include <stdio.h>
#include <string.h>int main()
{char arr[] = "abcdefabcdef";char* p = "efab";char* ret = strstr(arr, p);printf("%s\n", ret);return 0;
}

在这里插入图片描述

strstr的模拟实现

#include <assert.h>
const char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);const char* s1 = NULL;const char* s2 = NULL;const char* cur = str1;if (*str2 == '\0'){return str1;}while (*cur){s1 = cur;s2 = str2;while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0'){return cur;}cur++;}}int main()
{char arr[] = "abbbcdef";char* p = "bbcq";const char* ret = my_strstr(arr, p);if (ret == NULL){printf("不存在\n");}else{printf("%s\n", ret);}return 0;
}

在这里插入图片描述

十一、strtok函数的使用

strtok(char *str, const char *sep)函数用于根据分隔符sep分割字符串str。第一次调用时,str为要分割的字符串;后续调用时,str应为NULL,以继续分割上次操作的字符串。
示例代码:使用strtok
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

#include <stdio.h>
#include <string.h>int main()
{char arr[] = "192.168.6.111";char *sep = ".";char *str = NULL;for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}return 0;
}

十二、strerror函数的使用

strerror(int errnum)函数用于将错误码errnum对应的错误信息以字符串形式返回。错误码通常存储在errno变量中。
在这里插入图片描述

在这里插入图片描述

示例代码:使用strerror

#include <errno.h>int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("打开文件失败,原因是:%s", strerror(errno));return 1;}else{printf("打开文件成功\n");fclose(pf);pf = NULL;}return 0;
}

在这里插入图片描述

#include <errno.h>
#include <string.h>
#include <stdio.h>int main()
{int i = 0;for (i = 0; i <= 10; i++){printf("%s\n", strerror(i));}return 0;
}

输出示例

No error
Operation not permitted
No such file or directory
No such process
Interrupted function call
Input/output error
No such device or address
Arg list too long
Exec format error
Bad file descriptor
No child processes

总结

本文详细介绍了C语言中常用的字符和字符串函数,包括它们的使用方法和模拟实现。通过这些函数,我们可以高效地处理字符和字符串,从而简化编程过程。希望本文能帮助你更好地理解和应用这些函数,提升你的C语言编程能力。如果你对这些函数还有其他疑问,欢迎在评论区留言讨论!

相关文章:

  • COMSOL多孔结构传热模拟
  • VTK-8.2.0源码编译(Cmake+VS2022+Qt5.12.12)
  • 零跑B01上海车展全球首秀,定义纯电轿车新基准
  • 3D模型格式转换工具HOOPS Exchange 2025.3.0更新:iOS实现Rhino格式支持!
  • CS144 Lab3 实战记录:TCP 发送器实现
  • 奶茶店里面的数据结构
  • ProxySQL实现mysql8主从同步读写分离
  • Vue3祖先后代组件数据双向同步实现方法
  • TypeScript-知识点梳理
  • 阿里云 AI 搜索开放平台:RAG智能化工作流助力 AI 搜索
  • 【数据结构和算法】6. 哈希表
  • Hive中Map和Reduce阶段的分工
  • C++笔记-stack_queue(含deque,priority_queue,仿函数的讲解)
  • NHANES指标推荐:CTI
  • NOIP2012提高组.同余方程
  • Java基础复习(JavaSE进阶)第九章 网络编程
  • 考研单词笔记 2025.04.23
  • 脂质体挤出器有哪些知名品牌?
  • 2025深圳中兴通讯安卓开发社招面经
  • 【金仓数据库征文】从Oracle到KingbaseES的语法兼容与迁移
  • 央行上海总部:上海个人住房贷款需求回升,增速连续半年回升
  • 封江晚开江早,东北地区主要江河上一冰封期冰层较常年偏薄
  • 印控克什米尔26名游客遭恐袭丧生后,印度对巴宣布多项反制措施
  • 韩国检方以受贿嫌疑起诉前总统文在寅
  • 游客大理古城买瓜起争执:170克手机称出340克
  • 西湖大学本科新增临床医学专业,今年本科招生专业增至8个