字符函数和字符串函数

本文详细介绍了C语言中常用的字符函数如strlen、strcpy、strncpy、strcat、strncat、strcmp、strncmp等的使用方法和模拟实现,以及字符串处理函数如strstr、strtok和错误处理函数strerror的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符函数

使用时需要包含头文件<ctype.h>

字符分类函数

字符分类函数是一系列函数,用于判断该字符是否是符合的字符类型。

在这里插入图片描述

if(islower('a'))
   {
      printf("是小写\n");
   };

在以上代码中,islower函数能够判断a是否为小写字母并返回一个值,如果是则返回非零,反之则返回零

字符转换函数

在这里插入图片描述
tolower函数能够将字符串中所有的大写字母转化成小写
toupper函数能够将字符串中所有的小写字母转化成大写

字符串函数

strlen的使用和模拟实现

char arr = {"abcd"};
size_t i = strlen(arr);
printf("%zd\n", i);

它能够计算出给定字符串的长度(不计\0),返回值是size_t,一种无符号整数,打印时占位符使用%zd

模拟实现思路:遍历字符串,每经过一个字符计数器就加一,直到遇到\0

size_t Strlen(char* str)
{
   size_t count = 0;
   while(*str)
   {
      count++;
      str++;
   }
   return count;
}

也可以使用递归的方式

size_t Strlen(char* str)
{
   if(*str)
      return 1 + Strlen(str + 1);
   else
      return 0;
}

strcpy的使用的和模拟实现

strcpy函数能够用于将一个字符串的内容拷贝到另一个字符串里面,返回值是目标字符串首字符地址

char arr1 = "";
char arr2 = "abcde";
printf("%s\n", strcpy(arr1, arr2));//返回了arr1的地址,所以可以一直向后打印

**模拟实现思路:**遍历字符串,修改str1的内容

char* Strcpy(char* str1, char* str2)
{
   assert(str1 && str2);
   char* ret = str1;
   while(*str1 = *str2)
   {
      str1++;
      str2++;
   }
   return ret;
}

strncpy的使用和模拟实现

strcpy有一个不足之处,就是没有办法自己拷贝到自己的最后面,不然会因为’\0’的缺失而导致程序崩溃。
strncpy能够拷贝一定大小的字符串,并主动加上’\0’,所以它比strcpy多一个参数size_t num,传入的是需要拷贝的字节数

在这里插入图片描述

模拟实现思路: 大致和strcpy相同,不过需要加上一个循环次数

char* Strcpy(char* str1, char* str2, size_t num)
{
che* ret = str1;
   while(num)
   {
      *str1 = *str2;
      str1++;
      str2++;
      num--;
   }
   *str1 = '\0';
   return ret;
}

strcat的使用和模拟实现

这个函数可以将一个字符串内容拷贝到另一个字符串的最后面

在这里插入图片描述
**模拟实现思路:**首先让str1的指针指向数组的’\0’,再将要拷贝的内容填充上去

char* Strcat(char* str1, const char* str2)
{
   assert(str1 && str2);
   char* ret = str1;
   while(*str1)
   {
      str1++;
   }
   while(*str2)
   {
      *str1 = *str2;
      str1++;
      str2++;
   }
   str1 = '\0';
   return ret;
}

strncat的使用

和strncpy一样,strncat与strcat的区别就是strncat多一个size_t num参数,用来指定拷贝的字节数

在这里插入图片描述

strcmp的使用和模拟实现

strcmp用于比较字符串的大小(依据为ASCII码值的大小),如果前面的字符串>后面的字符串,返回一个正数;如果相等,返回零;如果前面<后面,返回一个负数

在这里插入图片描述
模拟实现思路: 如果两个字符相等,就继续往后走,如果不相等就判断大小

int Strcmp(char* str1, char* str2)
{
   assert(str1 && str2);
   while(*str1 == *str2)
   {
      str1++;
      str2++;
      if(*str1 == '\0' && *str2 == '\0')
         return 0;
   }
   if(*str1 > *str2)
      return 1;
   else
      return -1;
   
}

strncmp的使用

同样的,需要多传入一个参数限制比较的字节数

在这里插入图片描述

strstr的使用

strstr函数能够在一个字符串中找另一个字符串是否包含于这个字符串,

如果找到了,返回第一个找到的首元素地址,没找到返回NULL;

如果要找的字符串为空,返回被查找的字符串的首元素地址

char arr1 = "abcedf";
char arr2 = "ced";
printf("%s\n", strstr(str1, str2));

strstr的模拟实现有两种算法,BF算法和KMP算法,等我有时间会详细解读

strtok的使用

strtok可以拿出被分隔符分隔的字符串中的内容

它包含两个参数,一个是原字符串,一个是分隔符字符串

char* strtok(char* str, const char* delimiters)

当str不为NULL时,函数会找到str中第一个delimiters中写入的分隔符,并置为’\0’

当str为NULL时,函数会找到第一次分割开的位置,继续找下一个分隔符

char arr[] = "TraStel@stu.123.cn";
char sep[] = "@."
printf("%s\n", strtok(arr, sep));
printf("%s\n", strtok(NULL, sep));
printf("%s\n", strtok(NULL, sep));
//这里如果不是NULL而是arr的话,结果和上一条代码一样打印TraStel

strerror的使用

在写代码时,可能会有各种语法错误,每一个错误都有对应的编号,在strerror函数中传入该编号就可以打印对应的错误信息

for(int i = 0; i < 10; i++)
{
   printf("strerror(%d) : %s\n", i, strerror(i));
}

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值