首页 > 其他分享 >C语言(各种字符函数的使用)

C语言(各种字符函数的使用)

时间:2024-09-26 20:52:18浏览次数:3  
标签:字符 arr 函数 sz int C语言 char ++

 目录

字符分类函数

islower函数

isupper函数

字符转换函数

strlen函数的使用和模拟实现

strlen模拟实现计数器⽅式

strlen模拟实现不能创建临时变量计数器

strlen指针-指针的⽅式

stcpy的使用和模拟实现

stcpy模拟实现

strcat的使用和模拟实现

strcat模拟实现

strcmp的使用和模拟实现

stcmp模拟实现

strncpy函数

strncpy模拟实现

strncat函数

strncat模拟实现

strncmp函数

strncmp模拟实现

strtok函数

strerror函数

strstr函数的使用和模拟实现

strstr函数的模拟实现

​编辑

模拟的strstr


在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数,接下来我们就学习⼀下这些函数。

字符分类函数

C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。
这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h

这里就介绍几个函数吧,用法都是一样的


islower函数

是小写字母将返回大于0的数字

6be48744219f4630966aa57e10d542cd.png


不是小写字母返回0

a46a9694b3884f8d831e34630f341225.png


isupper函数

是大写字母返回大于0的数字

ea5fdca8213848bda105892448e68379.png


不是大写字母返回0

bb6bdfd2a937476aa3775694e6b0b21f.png


字符转换函数

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写

小写转大写就是-32

大写转小写就是+32

字符串小写转大写

下面这代码我们可以看到利用islower函数判断是不是小写,是的话利用toupper转大写

当然+32也是可以的

2da41c28fe1449b7a64fd67fe1493986.png


字符串大写转小写

下面这代码我们可以看到利用isupper函数判断是不是小写,是的话利用tolower转小写

当然-32也是可以的

6b7fad6407b94d21bd1be40cbb938a2b.png


strlen函数的使用和模拟实现

需要的头文件:#include<string.h>

https://cplusplus.com/reference/cstring/strlen/?kw=strlen

strlen是计算字符串长度的

2b59cca1ad474f2298d7e9a5c5206f97.png


strlen模拟实现计数器⽅式

利用一个变量来计数

2d16441576b04e07abf0e535813d77d9.png

//计数器
int mn_strlen(char* x)
{
	//计数器
	int num = 0;
	while (*x != '\0')
	{
		num++;
		x++;
	}
	return num;
}
int main()
{
	char arr[] = "asdfsffgdg";
	int r = mn_strlen(arr);
	printf("%d\n", r);
	return 0;
}

strlen模拟实现不能创建临时变量计数器

使用递归方法实现strlen函数

45d35c16faf149e48d0f3c6d3b5f173c.png

//不能创建临时变量计数器
int mn_strlen(char* x)
{
	if (*x == '\0')
	{
		return 0;
	}
	else
	{
		//每次递归,地址往后走,遇到\0回归
		return 1 + mn_strlen(x + 1);
	}
}
int main()
{
	char arr[] = "asdfsffgdg";
	int r = strlen(arr);
	printf("%d\n", r);
	return 0;
}

strlen指针-指针的⽅式

29a69d4d24d5425dba6b5fe88fd1ec90.png

int mn_strlen(char* x)
{
	int* p = x;
	//循环往后到\0
	while (*p != '\0')
	{
		p++;

	}
	//通过后面的地址减去首地址就可以拿到有多少个了
	return p - x;;
}
int main()
{
	char arr[] = "asdfsffgdg";
	int r = strlen(arr);
	printf("%d\n", r);
	return 0;
}

stcpy的使用和模拟实现

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/stcpy/

这个函数是复制字符串

源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷⻉到⽬标空间。
⽬标空间必须⾜够⼤,以确保能存放源字符串。
⽬标空间必须可修改。

3b9b2e5f509642e59a7343934c791366.png


stcpy模拟实现

187362e311694620bc1c51317a7db5ab.png

char* mn_stcpy(char* x, char* y)
{
	while (*y != '\0')
	{
		*x = *y;
		x++;
		y++;
	}
}
int main()
{
	char arr[] = "asfsdfs";
	char r[99] = { 0 };
	mn_stcpy(r, arr);
	printf("%s\n", r);
}

strcat的使用和模拟实现

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strcat/

strcat函数就是在字符串后面追加字符串

d0c0cd7ee11d4b688c0524f3ce056899.png


strcat模拟实现

就是先把r往后走到\0停下来,然后arr赋值到r后面

28319235ac1147b4818fe824099b5fe5.png

char* mn_strcat(char* r, char* arr)
{
	//r走到\0的位置
	while (*r != '\0')
	{
		r++;
	}
	//把arr的字符串赋值到r字符串的后面
	while (*arr != '\0')
	{
		*r = *arr;
		r++;
		arr++;
	}
}
int main()
{
	char arr[] = "asfsdfs";
	char r[99] = "xxxx ";
	mn_strcat(r, arr);
	printf("%s\n", r);
}

strcmp的使用和模拟实现

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strcmp/

21dd775738c24e9f9cad0ab4990a9fe8.png

strcmp是比较字符串的,当然是一个一个字符比较的

小于就返回小于0的数字

大于就返回大于0的数字

等于返回0

下面这代码我们可以看到s比z小返回-1

比较是通过ASCII码来比较的

ad8bc3f41179405882cd619d6470ba4f.png


stcmp模拟实现

9e13ba0bc54e46e7bd61048b9b01c73b.png

int mn_strcmp(char* x, char* y)
{
	//等于就往后找
	while (*x == *y)
	{
		//x找到\0就说明这2个数组都是一样的
		if (*x == '\0')
		{
			return 0;
		}
		x++;
		y++;
	}
	//小于返回-1
	if (*x < *y)
	{
		return -1;
	}
	//大于返回1
	else
	{
		return 1;
	}
}
int main()
{
	char arr[] = "asfsdfs";
	char arr2[] = "asfzdfs";
	int r = mn_strcmp(arr, arr2);
	printf("%d\n", r);
}

strncpy函数

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strncpy/

strcpy是复制整个字符串,str n cpy这个数可以自己指定要复制多少个字符

78078dbdeb554534903245c1d1d655f0.png

e10bd2ac17c447449692b1dff783513e.png


strncpy模拟实现

ccd0e164e6ca448290c47d07037643fd.png

char* mn_strncpy(char* r, char* arr, size_t sz)
{
	while (sz--)
	{
		*r = *arr;
		r++;
		arr++;
	}
}
int main()
{
	char arr[] = "asfsdfs";
	char r[99] = {0};
	mn_strncpy(r, arr,3);
	printf("%s\n", r);
}

strncat函数

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strncat/

这个函数可以自己指定要追加多少个字符

aaf34f3d478d4729af42e22d645452aa.png


strncat模拟实现

388b34c3988d4b229fc2ce14475ba196.png

char* mn_strncat(char* r, char* arr, size_t sz)
{
	while (*r != '\0')
	{
		r++;
	}
	while (sz--)
	{
		*r = *arr;
		r++;
		arr++;
	}
}
int main()
{
	char arr[] = "asfsdfs";
	char r[99] = "xxxx ";
	mn_strncat(r, arr, 3);
	printf("%s\n", r);
}

strncmp函数

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strncmp/

这个函数可以自己指定要比较多少个字符

24ce1bc6c45344c38fbc5813875241ba.png


strncmp模拟实现

87f662342b9744099f5ff0ef91dc72c6.png

int mn_strncmp(char* x, char* y, size_t sz)
{
	//循环判断x等于y就往后走,不等于就跳出
	while (*x == *y)
	{
		//sz等于0了,就说明这些字符是一样的
		if (sz == 0)
		{
			return 0;
		}
		x++;
		y++;
		sz--;
	}
	//判断大于,小于
	if (*x < *y)
	{
		return -1;
	}
	else
	{
		return 1;
	}
}
int main()
{
	char arr[] = "asfsdfs";
	char arr1[] = "asfsdfs";
	int r = mn_strncmp(arr, arr1, 3);
	printf("%d\n", r);
}

strtok函数

https://legacy.cplusplus.com/reference/cstring/strtok/

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

strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容
并且可修改。)
• strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串
中的位置。
• strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标
记。
• 如果字符串中不存在更多的标记,则返回 NULL 指针。

strtok函数的第⼀个参数不为 NULL ,函数将找到p中第⼀个标记,strtok函数将保存它在字符串
中的位置。
strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标


strerror函数

https://legacy.cplusplus.com/reference/cstring/strerror/

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


strstr函数的使用和模拟实现

需要的头文件:#include<string.h>

https://legacy.cplusplus.com/reference/cstring/strstr/

这是一个字符串匹配

int main()
{
	char arr[] = "asdfddds";
	//匹配arr里有没有这个字符串
	char* p = "fdd";
	//没有就返回NULL,有就返回arr的qwe和后面的字符串
	char*r = strstr(arr, p);
	if (r == NULL)
	{
		printf("不存在");
	}
	else
	{
		printf("%s\n", r);
	}
}

strstr函数的模拟实现

main函数


模拟的strstr

我们可以创建是S1和S2这2个指针进行比较

创建sz指针把arr的地址给sz,让sz找\0这样的话,

sz赋值给s1,p赋值给s2

s1有2个相同第3个不同这样的话可以返回回来sz++继续找下一个

s2也是一样第3个不同可以返回回来

char* mn_strstr(char* arr, char* p)
{
	char* s1 = NULL;
	char* s2 = NULL;
	char* sz = arr;
	while (*sz != '\0')
	{
		//赋值给s1和s2去匹配,这样的话s1找不到的话sz赋值回来继续找s2也一样
		s1 = sz;
		s2 = p;
		while (*s1 == *s2)
		{
			s1++;
			s2++;
			//s2的走到\0就说明找到了
			if (s2 == '\0')
			{
				//返回sz的地址
				return sz;
			}
		}
		sz++;
	}
	//找不到返回NULL
	return NULL;
}

标签:字符,arr,函数,sz,int,C语言,char,++
From: https://blog.csdn.net/2401_86723488/article/details/142471140

相关文章

  • c语言中对字符串进行左旋的三种方法
    例如:对 a  b  c  d            b  c  d  a左旋第一次              c  d  a  b左旋第二次                 d  a  b  c左旋第......
  • 掌握 JavaScript 的数学对象:内置数学函数和属性的综合指南
    javascript数学对象:概述javascriptmath对象是一个内置对象,提供数学函数和常量的集合。它不是构造函数,因此您无法创建它的实例;相反,它是通过其静态方法和属性直接使用的。1.常数math对象包含几个对数学计算有用的常量:math.e:自然对数的底数,约等于2.718。math.ln2:2的自然对......
  • 将函数提升到 Effect-TS 选项上下文中:实用指南
    在函数式编程中,提升是指使函数适应特定上下文(例如选项)的过程。effect-ts提供了将函数提升到option上下文的便捷方法,允许您将函数或谓词无缝地应用于option值。在本文中,我们将探讨两个关键的提升函数:o.lift2和o.liftpredicate。示例1:使用o.lift2提升二元函数......
  • Day 6 字符类型内置方法
    今天没有昨日回顾,做了几道题,有生成*的金字塔,进阶猜年龄等等。今天主要学了字符类型的内置方法,就目前而言,还不知道这些有序无序,可变不可变等信息有何作用,但先学着呗,万一有用的,。但是这些快捷方式应该挺好用的,还不错。!目录1为什么要有数据类型?2数字类型内置方法2.1整形2.2浮点......
  • 资本(生成函数)
    $\quad$其中$n\le1e3$、$m\le1e9$、$T\le10$。$\quad$这是一个排列问题,所以我们可以考虑指数型生成函数,这里我们称\(x^n\)的系数为\(\frac{x^n}{n!}\)之前的系数,下文记作\([x^n]\)。$\quad$我们定义函数\(f_{k}(x)=\sum_{n=0}^{k}\frac{x^n}{n!......
  • Kotlin:变量声明,null安全,条件语句,函数,类与对象
    目录一,变量声明1.1var和val1.2 类型推断1.3 Null安全1.3.1处理可为null性二,条件语句2.1条件语句与条件表达式2.2 智能类型转换三,函数3.1简化函数声明3.2匿名函数3.3高阶函数四,类与对象4.1构造函数4.1.1主构造函数4.1.2次构造函数一,变量声明1.1......
  • c语言--结构体
    一结构体详解1.1结构体类型声明1 structtag2 {3 member-list;4 }variable-list;struct是结构体关键字 tag是结构体的标签名,是自定义的 structtag就是结构体类型 {}里面放的是成员列表 variable-list是变量 member-lis......
  • c语言--文件操作
    一为什么使用文件?如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤⽂件。二什么是文件磁盘(硬盘)上的⽂件是⽂件。但是在程序设计中,我们⼀般谈的......
  • C++ 原始字符串(raw string literal )R“(...)“
    C++11可以在代码里嵌入一段原始字符串,该原始字符串不作任何转义,所见即所得。这个特性对于编写代码时要输入多行字符串,或者含带有特殊字符的字符串提供了巨大方便。语法:     R"(...)"记忆点:1.不做任何转义 stringstr="aaa\nbbb\nccc\n"; cout<<str<<endl......
  • 红黑树|定义、左旋函数、右旋函数和对插入结点的修复
    红黑树|定义、左旋函数、右旋函数和对插入结点的修复1.红黑树类的定义2.左旋函数和右旋函数3.对插入结点的修复1.红黑树类的定义enumclassColor{ RED, BLACK};template<typenameKey,typenameValue>classRedBlackTree{ classNode { public: Key......