首页 > 其他分享 >C语言—字符函数和字符串函数解析及其模拟实现

C语言—字符函数和字符串函数解析及其模拟实现

时间:2023-03-27 15:32:29浏览次数:39  
标签:字符 const 函数 int C语言 char 字符串


目录

一、求字符串的长度

1、strlen()-字符串长度

二、长度不受限制的字符串函数

1、strcpy()-字符串拷贝

2、strcat()-字符串追加

3、strcmp()-字符串比较

三、长度受限制的字符串函数

1、strncpy()-字符串拷贝n个字符

2、strncat()-字符串追加n个字符

3、strncmp()-比较字符串的 前n个字符

四、字符串查找

1、strstr()-查找字符串

2、strtok()-字符串分割

五、错误信息报告

1、strerror()-错误码对应的错误信息

六、字符函数

1、字符分类函数

2、字符转换函数

重点介绍处理字符和字符串的库函数的使用和注意事项以及模拟实现

一、求字符串的长度

1、strlen()-字符串长度

格式:

size_t strlen(const char* str);

实例:

C语言—字符函数和字符串函数解析及其模拟实现_开发语言

要点:

1、字符串包含“\0”,但strlen()函数所求的长度是“/0”之前的个数

2、参数指向的字符串必须要以“\0”结束

3、注意函数的返回值是size_t(unsigned int),是无符号的(易错)

C语言—字符函数和字符串函数解析及其模拟实现_开发语言_02

模拟实现:

int my_strlen(const char* arr) {
	int count = 0;
	assert(arr != NULL);
	while (*arr != '\0') {
		count++;
		arr++;
	}
	return count;
}

二、长度不受限制的字符串函数

1、strcpy()-字符串拷贝

格式:

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

实例:

C语言—字符函数和字符串函数解析及其模拟实现_开发语言_03

要点:

1、源字符串必须以“\0”结束

2、会将原字符串中的“\0”拷贝到目标空间

3、目标空间必须足够大,以确保能存放源字符串

4、目标空间必须可变

2、strcat()-字符串追加

格式:

char* strcat(char* dastination,const char* source)

实例:

C语言—字符函数和字符串函数解析及其模拟实现_错误信息_04

要点:

1、源字符串必须以“\0”结束

2、目标空间必须足够大,能容纳下源字符串的内容

3、目标空间必须可修改

字符串自己给自己追加,如何?

不可,无限循环,系统崩溃!!!

原因:追加时,dest字符串的“\0”被覆盖,src没有结束标志。

C语言—字符函数和字符串函数解析及其模拟实现_字符串_05

模拟实现:

char* my_strcat(char* dest, const char* src) {
	
	char* ret = dest;
	assert(dest && src);
	//1、找到目标字符串
	while(* dest){
		dest++;
	}
	//2、追加源字符串
	//a、执行*dest = *src,拷贝字符
	//b、对dest,src,执行++操作,拷贝下一个字符
	//c、当*dest = *src时,退出while循环
	while(*dest++ = *src++){
		
	}
	return ret;
}

3、strcmp()-字符串比较

格式:

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

实例:

C语言—字符函数和字符串函数解析及其模拟实现_开发语言_06

标准规定:

1、第一个字符串>第二个字符串,则返回>0 的数字

2、第一个字符串=第二个字符串,则返回0

3、第一个字符串<第二个字符串,则返回<0 的数字

模拟实现:

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

三、长度受限制的字符串函数

1、strncpy()-字符串拷贝n个字符

格式:

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

实例:

C语言—字符函数和字符串函数解析及其模拟实现_c语言_07

要点:

1、从源字符串拷贝n个字符到目标字符串

2、如果源字符串的长度小于num,则拷贝完源字符串后,在目标后面追加“\0”,直到num个

2、strncat()-字符串追加n个字符

格式:

char* strncat(char* destination,const char* source,size_int num)

实例:

C语言—字符函数和字符串函数解析及其模拟实现_错误信息_08

要点:

1、从源字符串追加n个字符到目标字符串

2、如果源字符串的长度小于num,则拷贝完源字符串后便结束,不再继续追加

3、strncmp()-比较字符串的 前n个字符

格式:

char* strncat(char* destination,const char* source,size_int num)

实例:

C语言—字符函数和字符串函数解析及其模拟实现_错误信息_09

要点:

1、比较源字符串和目标字符串的前 n个字符

2、比较到出现另一个字符不一样或者一个字符串结束或者num个字符全部比较完成的时候结束

与第二点所提函数相比,本组三个函数的安全性相对较高,不易出bug

四、字符串查找

1、strstr()-查找字符串

格式:

char* strctr(const char*, const char*;

实例:

C语言—字符函数和字符串函数解析及其模拟实现_错误信息_10

要点:

1、用于在一个字符串1中,查找字符串2是否出现

2、如果有出现字符串1中查找到字符串2,返回第一个匹配字符的地址,否则,返回NUll

模拟实现:

char* my_strstr(const char* str1,const char* str2){

	assert(str1 && str2);
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cp = str1;

	if (*str2 == "\0") {
		return (char*)str1;
	}
	while (*cp) {
		s1 = cp;
		s2 = str2;
		
		while (*s1 && *s2 && (*s2 == *s1)) {
			s1++;
			s2++;
		}
		if (*s2 == '\0') {
			return (char*)cp;
		}
		cp++;

	}
	return NULL;
}

易混淆点:

        const 离变量名近就是用来修饰指针变量的,离变量名远就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据

2、strtok()-字符串分割

格式:

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

实例:

C语言—字符函数和字符串函数解析及其模拟实现_错误信息_11

要点:

1、sep参数是一个字符串,定义用作分隔符的字符集合

2、第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中的一个或者多个分隔符分割的标记

3、strtok函数找到str中的下一个标记,并将其用“\0”结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可以修改)

4、strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存让他在字符串中的位置

5、strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记

6、如果字符串中不存在更多的标记,则返回NULL指针

五、错误信息报告

1、strerror()-错误码对应的错误信息

格式:

char* strerr (int errnum);

实例:

C语言—字符函数和字符串函数解析及其模拟实现_错误信息_12

要点:

1、返回错误码对应的错误信息

2、使用库函数到时候,调用库函数失败时,都会设置错误码errno(int类型)

六、字符函数

1、字符分类函数

        函数                     如果他的参数符合下列条件就返回真

1、iscntrl                1、任何控制字符
2、isspance           2、空白字符:空格,换行,换页,回车等
3、isdigit                3、十进制数字0-9
4、isxdigit              4、十六进制数字,包括所有十进制数字,小写字母a-f,大写字母A-F
5、islower              5、小写字母a-z
6、isupper             6、大写字母A-Z
7、isalpha              7、字母a-z或A-Z
8、isalnum             8、字母或者数字a-z,A-Z,0-9
9、ispunct              9、标点符号
10、isgraph           10、任何图形字符
11、isprint              11、任何可打印字符,包括图像字符,空白字符

2、字符转换函数

int tolower( int c);-转小写

int toupper( int c);-转大写

实例:

C语言—字符函数和字符串函数解析及其模拟实现_错误信息_13

~

标签:字符,const,函数,int,C语言,char,字符串
From: https://blog.51cto.com/qiux/6152252

相关文章

  • C语言 | C语言中的四种特殊函数
    目录1.递归函数2.变参函数3.回调函数4.内联函数5.拓展1.递归函数与普通函数比较,执行过程不同,该函数内部调用它自己,它的执行必须要经过两个阶段:递推阶段,回归阶段。递推阶段-......
  • mysql 省事方便的函数
    1、group_concat在我们平常的工作中,使用groupby进行分组的场景,是非常多的。比如想统计出用户表中,名称不同的用户的具体名称有哪些?sql:  select name from `user`......
  • 如何编写一个arrange 函数
    /***@description链式调用的方法*@param{*}taskIs*@example*arrange('arrage').waitFirst(2).do('吃西瓜').do('吃西瓜2').execute()*@returns{exec......
  • C语言学习记录(七)
    C语言学习记录(七)一、知识要点(函数)一、函数的作用在一个应用程序中的若干个功能相互独立,可单独操作的程序单元叫做模块。在C语言中用函数实现模块的功能,将这些模块构成......
  • Oracle-nvl函数的使用(及其相似函数)
    Oracle中的nvl函数使用//SQL实例selectNVL("字段名称",指定常量)from"表名";//结构拆解NVL("数据1","数据2");代码解释上述SQL的含义是指,从指定表中查出指定字段......
  • c#动态执行字符串脚本(优化版)
    像javascript中有eval()来执行动态代码,c#中是没有的,于是自己动手丰衣足食,先来代码1usingSystem;2usingSystem.Data;3usingSystem.Configuration;4us......
  • Oracle中nvl()与nvl2()函数详解
    1.nvl:根据参数1是否为null返回参数1或参数2的值【函数格式】:nvl(expression1,expression2)【函数说明】:若expression1值为null,则该函数返回expression2;若expression1......
  • python 类的方法与普通函数的区别
    引用菜鸟教程中所说:类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,按照惯例它的名称是self。下面我就写了个类的构造方法和类的方法,......
  • 【DP】LeetCode 剑指 Offer 46. 把数字翻译成字符串
    题目链接剑指Offer46.把数字翻译成字符串思路这个问题与dp中的经典问题“跳台阶”问题十分类似,在跳台阶问题中我们是选择跳一个台阶或者两个台阶,而在这个问题中我......
  • Delphi Locate函数[1] - 查询、定位
     DelphiTDataSet.Locate函数-查询、定位使用ADO等数据控件的时候,经常会用到 locate函数,在结果数据集中查询和定位,下面介绍一下:原型:1function Locat......