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

C语言_字符函数和字符串函数

1. 字符函数

1.1 字符分类函数

在C语言中,有一系列专门做字符分类的函数被包括在头文件<ctype.h>

这些函数的区分范围如下:

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格’ ‘、换页’\n‘、回车’\r‘、制表符’\t‘ 、垂直制表符’\v‘
isdigit十进制数字 ’0‘ ~ ’9‘ 字符
isxdigit十六进制数字,包括所有十进制数字字符,大写字母 A ~ F,小写字母 a ~ f
islower小写字母 a ~ z
isupper大小字母 A~ Z
isalpha小写字母 a ~ z 和 大小字母 A~ Z
isalnum字母 a ~ z、A ~ Z 或数字 0 ~ 9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

我们来举一个例子来说明这些函数的用法:

int isupper(int C);

isupper函数可以判断参数部分的C是否属于大写字母范围。如果是就返回非0整数,如果不是就返回0。

应用
将字符串中的大写字母转小写,其他字符不变。

#include<stdio.h>
#include<ctype.h>

int main(){
	int i = 0;
	char str[]="Test String\n";
	while(str[i]){
		if(isupper(str[i]))
			str[i]+=32;
		putchar(str[i]);
		i++;
	}
	return 0;
}

1.2 字符转换函数

字符转换函数可以大写转小写、小写转大写

函数使用形式如下:

int tolower(int C);
int toupper(int c);

函数应用如下:

#include<stdio.h>
#include<ctype.h>

int main(){
	int i = 0;
	char str[]="Test string\n";
	while(str[i]){
		if(isupper(str[i]))
			str[i] = tolower(str[i]);
		putchar(str[i]);
		i++;
	}
	return 0;
}

2. 字符串函数

字符串函数的使用都需要包含头文件<string.h>

2.1 strlen的使用及模拟实现

函数形式如下:

size_t strlen(const char* str);

函数解析及注意事项:

  • strlen函数返回的是在字符串中 \0前面出现的字符个数(不包括 \0
  • 参数指向的字符串必须要以 \0结束
  • 函数的返回值为size_t(无符号整形)
  • strlen的使用要包含头文件<string.h>

函数的模拟实现:
(1)计数器方式

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

int main() {
	char* ch = "abcdef";
	printf("%d", strlen(ch));
}

(2)不创建临时变量,运用函数递归

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

int main() {
	char* ch = "123456";
	printf("%d",my_strlen(ch));
}

(3)指针 - 指针

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

int main() {
	char* ch = "123456";
	printf("%d",my_strlen(ch));
}

2.2 strcpy的使用及模拟实现

函数形式如下:

char* strcpy(char* destination, const char* source);

函数解析及注意事项:

  • strcpy函数的作用是将源字符串拷贝到目标字符串
  • 源字符串必须以 \0 结束
  • 源字符串的\0也会被拷贝到目标空间
  • 目标空间必须足够大,确保能存放源字符串
  • 目标空间必须可修改

函数的模拟实现:

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

int main() {
	char d[] = "abcdef";
	char* s = "123";
	printf("%s", my_strcpy(d, s));
	return 0;
}

2.3 strcat的使用及模拟实现

函数形式如下:

char* strcat(char* destination, const char* source);

函数解析及注意事项:

  • strcat函数的作用是将源字符串追加到目标字符串的后面
  • 源字符串必须以\0结束
  • 目标字符串中也得有\0,否则没办法知道追加从哪里开始
  • 目标空间必须足够的大,能容纳两个字符串的内容
  • 目标空间必须可修改

函数的模拟实现:

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

int main() {
	char d[10] = "abcdef";
	char* s = "123";
	printf("%s", my_strcat(d, s));
	return 0;
}

2.4 strcmp的使用及模拟实现

函数形式如下:

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

函数解析及注意事项:

  • strcmp函数的作用是比较两个字符串的大小(比较两个字符串中对应位置上字符ASCII码值的大小)
  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

函数的模拟实现:

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

int main() {
	char* ch1 = "abcdef";
	char* ch2 = "abcf";
	if (my_strcmp(ch1, ch2) > 0) {
		printf("ch1 > ch2");
	}
	else if (my_strcmp(ch1, ch2) < 0) {
		printf("ch1 < ch2");
	}
	else {
		printf("ch1 == ch2");
	}
	return 0;
}

2.5 strstr的使用及模拟实现

函数的形式如下:

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

函数解析及注意事项:

  • strstr函数的作用是返回字符串str2在字符串str1中第一次出现的位置
  • 字符串的比较匹配不包括\0字符,以``\0`作为结束标志

函数的模拟实现:

char* my_strstr(const char* str1, const char* str2) {
	char* cp = (char*)str1;
	
	if (!*str2)
		return (char*) str1;

	while (*cp) {//外循环用来刷新开始比较匹配的位置
		char* s1 = cp;
		char* s2 = (char*)str2;

		while (*s1 && *s2 && !(*s1 - *s2)) {//内循环用来比较匹配
			s1++;
			s2++;
		}
		if (!*s2)//如果s2为\0,说明比较匹配成功
			return cp;
		cp++;
	}
	return NULL;//如果外层循环已经遍历了一遍还未执行循环内的if语句的话,则说明匹配失败,返回空指针
}

2.6 strncpy的使用

函数形式如下:

char* strncpy(char* destination, const char* source, size_t num);

函数的解析及注意事项:

  • strncpy函数的作用是从源字符串拷贝num个字符到目标空间
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0,直到num

2.7 strncat的使用

函数的形式如下:

char* strncat(char* destination, const char* source, size_t num);

函数的解析及注意事项:

  • strncat函数的作用是将源字符串的前num个字符追加到目标字符串的末尾,在追加一个\0
  • 如果源字符串的长度小于num时,只会讲字符串中到\0的内容追加到目标字符串的末尾

函数使用实例:

#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",str1);	
	return 0;
}

2.8 strncmp的使用

函数形式如下:

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

函数的解析及注意事项:

  • strncmp函数的作用是比较str1str2的前num个字符(比较相应位置字符的ASCII码值)
  • 比较的规则与strcmp相同。

2.9 strtok的使用

函数的形式如下:

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

函数的解析及注意事项:

  • strtok函数的作用是将一个字符串分割成几个子字符串
  • sep参数指向一个用作分隔符的字符串
  • 第一个参数指定一个字符串,它包含了0个或多个由sep字符串中一个或多个分隔符分割的标记
  • strtok函数找到str中的一个标记,并将其用\0收尾,返回一个指向这个标记的指针
  • strtok函数的第一个参数不为NULL时,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
  • 如果字符串中不存在更多的标记,返回NULL

注:strtok函数会改变被操作的字符串,所以被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;
}

2.10 strerror的使用

函数形式如下:

char* strerror(int errnum);

函数底层逻辑及作用:

  • 底层逻辑:在不同的系统和C语言标准库的实现中都规定了一些错误码,放在<errno.h>头文件中,C语言程序启动的时候就会使用一个全局的整型变量errno来记录程序的当前错误码,当程序启动的时候errno0,表示没有错误,当我们在使用标准库中的函数发生错误时,就会减对应的错误码(一个整数)存放在errno中。每个错误码都对应着一个错误信息。
  • 作用strerror函数的作用是把参数部分的错误码对应的错误信息的字符串地址返回。

函数的使用:

#include<stdio.h>
#include<string.h>
#include<errno.h>

int main(){
	FILE* pfile = fopen("unexist.ent","r");
	if(pfile == NULL)
		printf ("Error opening file unexist.ent: %s\n", strerror(errno));
	return 0;
}

同时我们也可以了解一下perror函数,perror函数等同于一次将上方代码中的第9行。

#include<stdio.h>
#include<string.h>
#include<errno.h>

int main(){
	FILE* pfile = fopen("unexist.ent","r");
	if(pfile == NULL)
		perror("Error opening file unexist.ent");
	return 0;
}

今天的介绍就到这里,还要请各位佬儿们多多支持,多多点赞


http://www.kler.cn/news/329110.html

相关文章:

  • 网络原理-TCP协议
  • 使用 Docker 制作 YashanDB 镜像:深度解析与实战指南
  • 优秀博客:小程序通信方法在 Vue 3 中的对应技术
  • 分页查询前后端代码
  • 怎么在FTP服务器上配置SSL/TLS?
  • Python知识点:如何使用Spark与PySpark进行分布式数据处理
  • Linux——K8s pod调度
  • 用 API 实现 AI 视频摘要:动手制作属于你的 AI 视频小助手
  • docker的harbor仓库登录问题
  • Linux设备上cifx板卡作为ethercat从站的调试记录
  • 【Android 13源码分析】Activity生命周期之onCreate,onStart,onResume-1
  • 计算机网络:计算机网络概述 —— 初识计算机网络
  • 盒子是什么? -- 第四课
  • Meta推出Llama 3.2 AI模型,支持多模态和边缘计算;OpenAI首席技术官穆拉蒂宣布离职
  • 数据链路层 ——MAC
  • 设计模式——责任链模式
  • 螺狮壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习03(网络及IP规划)
  • AI 对话工具汇总
  • vulnhub-DarkHole 1靶机的测试报告
  • 想知道为什么有DICOM格式,YAML格式,XML格式,JSON格式吗?
  • OSI 七层模型和TCP/IP 四层模型的区别
  • PG数据库的Jsonb全文检索查询
  • 【React】useState 和 useRef:项目开发中该如何选择
  • R开头的后缀:RE
  • C++平台跳跃游戏
  • 智慧环保大数据平台建设方案
  • Windows 开发工具使用技巧 Visual Studio使用安装和使用技巧 Visual Studio 快捷键
  • httpsok-v1.17.0-SSL通配符证书自动续签
  • css-容器高度百分比(%),容器内的文字垂直居中
  • 梳理相关新闻报道:Linux惊现9.9分灾难级漏洞