7.C语言字符函数和字符串函数

本篇博客介绍C语言当中的字符函数和字符串函数

一、字符分类函数:判断一个字符属于什么类型,需要包含头文件“ctype.h”

C语言的字符分类函数

1.举例说明:islower函数,判断参数部分的c是否是小写字母 如果是小写字母:返回非零整数;不是小写字母:返回0

islower函数的原型

2.例子:写一个代码,将字符串中的小写字母转大写,其它字符不变

#include <stdio.h> 
#include <ctype.h> 
int main () 
{ 
	int i = 0; 
	char str[] = "Test String.\n"; 
	char c; 
	while (str[i]) 
	{ 
		c = str[i]; 
		if (islower(c)) 
		c -= 32; 
		putchar(c); 
		i++; 
	} 
	return 0; 
} 

二、字符转换函数(两个)

C语言字符转换函数

#include <stdio.h> 
#include <ctype.h> 
int main () 
{ 
	int i = 0; 
	char str[] = "Test String.\n"; 
	char c; 
	while (str[i]) 
	{ 
		c = str[i]; 
		if (islower(c)) 
		c = toupper(c); //可进行更改
		putchar(c); 
		i++; 
	} 
	return 0; 
} 

三、strcpy,strcat,strcmp的使用和模拟实现

1.strcpy的使用和模拟实现

strcpy的函数原型

(1)注意事项
①源字符串必须以’\0’结束
会将源字符串的’\0’拷贝到目标空间
③目标空间必须足够大且可修改
(2)模拟实现
①版本1

#include<assert.h>
void my_strcpy(char* dest, const char* src)
{
	assert(src != NULL);
	assert(dest != NULL);
	//拷贝\0前面的内容
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;//拷贝\0
}

注意:为保证指针的安全性,可进行assert断言
②版本2

#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
	assert(src != NULL);
	assert(dest != NULL);
	char* ret = dest;
	//拷贝\0前面的内容
	while (*dest++ = *src++)//此处进行了升级
	{
		;
	}
	return ret;//返回destination的起始地址
}

2.strcat(连接/追加字符串)的使用和模拟实现

strcat的函数原型

(1)注意事项
①源字符串必须以’\0’结束
目标字符串当中也得有’\0’,否则不知道从哪里开始追加
③目标空间必须足够大且可修改
(2)模拟实现
①函数返回目标空间的起始地址
②找到目标空间的\0
③拷贝数据(在\0后面追加)

#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;//保存目标空间的起始地址
	//1. 找打目标空间的\0
	while (*dest != '\0')
		dest++;
	//2. 拷贝
	while (*dest++ = *src++)
		;//空语句
	return ret;
}

注意:对于my_strcat:如果自己给自己追加,则会有死循环+非法访问内存,而VS提供的库函数库函数本身没问题
3.strcmp的使用和模拟实现
(1)strcmp库函数解析
strcmp的函数原型
① 标准规定
第一个字符串大于第二个字符串,返回大于0的数字(VS返回1)
第一个字符串等于第二个字符串,返回0(VS返回0)
第一个字符串小于第二个字符串,返回小于0的数字(VS返回-1)
② 判断逻辑:遇到第一个可以分出大小的字符就返回值
(2)strcmp的模拟实现

int my_strcmp (const char * str1, const char * str2) 
{ 
	int ret = 0 ; 
	assert(src != NULL); 
	assert(dest != NULL); 
	while(*str1 == *str2) 
	{ 
		if(*str1 == '\0') //*str1==*str2,字符串比较完成,结果是相等
			return 0; 
			str1++; 
			str2++; 
	} 
	return *str1-*str2; 
} 

四、strncpy,strncat,strncmp的使用

1.strncpy函数的使用

(1)从源字符串拷贝num个字符到目标空间
(2)如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0,直到凑齐num个
strncpy的调试

2.strncat函数的使用

(1)将源字符串的前num个字符追加到destination的字符串末尾,再追加一个\0
(2)如果源字符串长度小于num,只会将全部源字符串(含\0)追加,不补0
strncat的函数原型strncat的调试
效果:把abc进行追加,从arr1里面找3个字符
strncat的调试
效果:把abcdef进行追加,源字符串全部追加(含\0),不补0

3.strncmp函数的使用

strncmp的函数原型
比较str1和str2前num个字符(最多比较num个),其它同strcmp

五、strstr(字符串匹配函数)的使用和模拟实现

1.strstr函数解析

strstr的函数原型

(1)在str1里面找str2第一次出现的位置,若没找到,返回NULL
(2)函数返回str2在str1中第一次出现的位置
(3)字符串匹配不包含\0,以\0作为结束标志

#include<stdio.h>
int main()
{
	char arr1[]="this is an apple\n";
	char arr2[]="is";
	char*ret=strstr(arr1,arr2);
	if(ret!=NULL)
	{
		printf("%s\n",ret);```
	}
	else
	{
		printf("找不到\n");
	}

输出结果:is is an apple

2.strstr的模拟实现

代码与手写解析

六、strtok(字符串切分函数)的使用

1.sep指向一个字符串,该字符串包含了用作分隔符的字符集合(无需在意分隔符排列顺序)
2.str指向待切分的字符串
3.strtok找到str中的下一个标记,并将其用\0结尾,返回一个指向该标记的指针(strtok函数会修改被操作的字符串,所以被切分字符串一般是临时拷贝内容且可被修改)
4.*str不为NULL,函数将找到str中第一个标记,保存它在字符串中的位置
5.*str==NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
6.若字符串中不存在更多的标记,则返回NULL

#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的函数原型
1.strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
2.在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
	FILE*pfile;
	pfile=fopen("unexsist.ent","r");
	if(pFile==NULL)
		perror("Error openning file unexsist.ent");
	return 0;
}

输出:Error opening file unexist.ent: No such file or directory
perror:打印完参数部分的字符串后,再打印一个冒号和一个空格,再打印错误信息

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值