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小于numstrncpy不是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的错误信息。

描述信息:错误信息。

相关推荐
逑之8 小时前
C语言笔记1:C语言常见概念
c语言·笔记·c#
镜中人★8 小时前
408计算机组成原理考纲知识点
网络·笔记
栈与堆8 小时前
LeetCode-1-两数之和
java·数据结构·后端·python·算法·leetcode·rust
不知名XL8 小时前
day20 回溯算法part02
算法
Felven8 小时前
A. Blackslex and Password
c语言
嵌入式进阶行者8 小时前
【算法】TLV格式解析实例:华为OD机考双机位A卷 - TLV解析 Ⅱ
数据结构·c++·算法
OC溥哥9998 小时前
Paper MinecraftV3.0重大更新(下界更新)我的世界C++2D版本隆重推出,拷贝即玩!
java·c++·算法
Jayden_Ruan8 小时前
C++蛇形方阵
开发语言·c++·算法
星火开发设计8 小时前
C++ map 全面解析与实战指南
java·数据结构·c++·学习·算法·map·知识