C语言笔记11:字符函数和字符串函数

文章目录

C语言笔记11:字符函数和字符串函数

一、字符分类函数

包含ctype.h

看一个字符分类函数的用法

c 复制代码
#include <ctype.h>
#include <string.h>
#include <stdio.h>

int main()
{
	char str[] = "No Please";
	for(int i = 0;i < strlen(str);i++)
	{
		if(islower(str[i]))
			str[i] -= 32;
	}
	printf("%s\n",str);
	return 0;
}

其中的islower就是一个字符分类函数,用来判断一个字符是不是小写字母。

函数 介绍
iscntrl 任何控制字符(一般用于移动光标,蜂鸣,删除字符等)比如\0,\r,\v,\n,127删除字符,27esc退出,\a响铃
isspace 任何空白字符:空格' ',换行'\n',回车'\r',制表符'\t',垂直制表符'\v'
isdigit '0' ~ '9'字符
isxdigit 除了'0' ~ '9'还有一些十六进制字符'a' ~ 'f'或者'A' ~ 'F',x不是
islower 小写字母
isupper 大写字母
isalpha 大小写字母
ispunct 标点符号,不属于数字或者字母的可显示字符
isgraph 任何图形字符
isprint 图形字符+空白字符

附:

二、字符转换函数

包含ctype.h

c 复制代码
int tolower(int c);
int toupper(int c);
c 复制代码
#include <ctype.h>
#include <string.h>
#include <stdio.h>

int main()
{
	char str[] = "No Please";
	for(int i = 0;i < strlen(str);i++)
	{
		if(islower(str[i]))
			str[i] = toupper(str[i]);
	}
	printf("%s\n",str);
	return 0;
}

三、strlen使用和模拟

strlen使用:

c 复制代码
#include <string.h>
#include <stdio.h>

int main()
{
	size_t len = strlen("how long?");
   printf("%zd\n",len);
   
	return 0;
}

strlen模拟:

c 复制代码
#include <assert.h>

size_t my_strlen(const char* str)
{
	int count = 0;
	assert(str);
	while(*str)
	{
		count++;
		str++;
	}
	return count;
}
c 复制代码
#include <assert.h>

size_t my_strlen(const char* str)
{
   assert(str);
	if(*str == '\0')
		return 0;
	return 1+my_strlen(str+1);
}
c 复制代码
#include <assert.h>

size_t my_strlen(const char* str)
{
	assert(str);
	char* p = (char*)str;
	while(*p)
	{
		p++;
	}
	return p-str;
}

四、strcpy的使用和模拟实现

strcpy模拟实现:

c 复制代码
#include <assert.h>

char* my_strcpy(char* dest,const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while((*dest++ = *src++))//先赋值,再有返回值,再判断
	{
		;
	}
	return ret;
}

和strcat一样都是右边赋值给左边返回初始地址空间。

会拷贝\0到目标空间

五、strcat的使用和模拟实现

strcat模拟实现

c 复制代码
#include <assert.h>

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

会拷贝\0到目标空间并将原来的\0修改。
strcat不能自己拼接自己,想要自己拼接自己,可以定义一个临时缓冲区

六、strcmp使用和模拟实现

strcmp模拟实现:

c 复制代码
#include <assert.h>

int 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的使用

函数声明:

c 复制代码
char* strncpy(char* destination ,const char* source ,size_t num);

strncpy不会 在末尾自动添加\0除非源字符串长度strlen小于num,strncpy不是strcpy的替代品

八、strncat的使用

函数声明:

c 复制代码
char* strncat(char* destination ,const char* source ,size_t num);

strncat会 在末尾自动添加\0
函数使用:

c 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
	char str1[20];
	char str2[20];

	strcpy(str1, "Be water,");//Be water,
	printf("%s\n", str1);
	strcpy(str2, "my friend Long");//my friend Long
	printf("%s\n", str2);
	strncat(str1, str2, 9);//Be water,my friend

	printf("%s\n", str1);

	return 0;
}

九、strncmp的使用

函数声明:

c 复制代码
int strncmp(const char* str1,const char* str2,size_t num);

最多比较num个字符

遇到\0会停下来

十、strstr的使用和模拟实现

函数声明:

c 复制代码
char* strstr(const char* str1,const char* str2);

函数返回str2在str1中第一次出现的位置
使用:

c 复制代码
#include <string.h>
#include <stdio.h>

int main()
{
	char str[] = "This is a simple string";
	char* pch;
	
	pch = strstr(str,"simple");
	strncpy(pch,"sample",6);
	printf("%s\n",str);
	
	return 0;
}


strstr模拟实现:

c 复制代码
char* strstr(const char* str1,const char* str2)
{
   //一个外层循环p1,一个内层循环s1,s2
	char* p1 = (char*)str1;
	char* s1,s2;
	
	assert(str1 != NULL);
	assert(str2 != NULL);
	
	if(*str2 == '\0')
		return 	((char*)str1);
	while(*p1)
	{
		s1 = p1;
		s2 = (char*)str2;
		
		while((*s1 == *s2) && *s1 && *s2)
			s1++,s2++;
		//如果是到\0结束的	
		if(s2 == '\0')
			return cp;
			
		cp++;
	}
	return NULL;
}

十一、strtok函数使用

函数声明:

c 复制代码
char* strtok(char* str,const char* sep);
  • 第一个参数是char* 表示这个参数是要被修改的,当函数找到一个sep出现的位置时,会把sep改成\0并返回开始找的位置
  • 第一个参数分为NULL和非NULL两种情况,如果是非NULL就从头开始,并将函数内部的静态指针修改为下一次开始的位置,如果是NULL,就从静态指针位置开始找
    函数使用:
c 复制代码
int main()
{
	char addr[] = "196.168.0.1";
	char* sep = ".";
	char* str = NULL;
	for(str = strtok(addr,sep); str != NULL ;str = strtok(NULL,sep))
	{
		printf("%s\n",str);
	}
	return 0;
}

运行结果:

十二、strerror函数的使用

c 复制代码
char* strerror(int errnum);

打印错误码对应的错误信息,这些信息一般存在errno.h头文件里面
使用:

c 复制代码
#include <errno.h>
#include <stdio.h>
#include <string.h>

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

结果:


perror:

perror("描述信息"),打印被设置的全局变量errno的错误信息。

描述信息:错误信息。

相关推荐
苏打豆1 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
Horn Still Sounds1 小时前
IMX6ULL裸机|I2C通信协议 + ADC模数转换学习笔记
arm开发·笔记·单片机·嵌入式硬件
蛋蛋的就会顺顺的1 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙1 小时前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头
zhangfeng11332 小时前
国产GPU/AI算力芯片现状(修订完整版 · 截至2026年9月
人工智能·算法·ai编程·npu
学代码的CJY2 小时前
从代码出发理解时间复杂度与空间复杂度
数据结构·算法
白帽攻防录3 小时前
SRC 挖洞:WSO2 JWT 算法混淆绕过深度复盘,CVE-2026-5430 不支持的算法怎么变成管理员
网络·算法·安全·网络安全·jwt
白山编程大哥3 小时前
Lua 中使用 C 语言的用户自定义类型——userdata
c语言·junit·lua
无敌贵点大王3 小时前
RTThread学习记录13——关于要使用一个外设,RTThread与cubemx到底要怎么配合?
c语言·stm32·学习·rtthread
小O的算法实验室3 小时前
IEEE TEVC,基于精确与DQN群智能调度方法用于多目标异构USV
算法