字符函数与字符串函数

前言

本次博客可以说内容最为多的一次博客,讲解同样很细致大家好好看看

1字符函数

在讲解字符函数时,大家得了解什么是字符吧

普通字符'a' ' b'  'c'  '1'  ' @'  转义字符' \n '  换行‘ \t’  水平制表符'\r'回车

大家了解即可

在C语言中字符也可以有分类

所以我们先来看看字符分类函数

1.1字符分类函数

大家看以上函数的参数返回值以及它的功能几乎一致

我们这里以这个函数为例

int isdigit ( int c );

isdigital 是能够判断参数部分的 c 是否是字符‘0’--‘9’的

代码

#include <stdio.h>
#include <ctype.h>
int main ()
{
  char str[]="1776ad";
  int size=sizeof(str)/sizeof(str[0]);
  while(size)
  {
    if(isdigit(str[0]))
    printf("该字符为数字字符%c\n",str[0]);
    size--;
  }
  return 0;
}

该代码能够把一个字符串中的数字字符找到

看看返回值

A value different from zero (i.e., true) if indeed c is a decimal digit. Zero (i.e., false) otherwise.

如果c确实是十进制数字,则为与零不同的值(即true)。否则为零(即false)

再举一个例子

int islower ( int 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 -= 32;
 putchar(c);
 i++;
 }
 return 0;
}

该代码的作用是将字符串中的⼩写字⺟转⼤写,其他字符不变

当然咱么是个细节的人,看看返回值

 value different from zero (i.e., true) if indeed c is a lowercase alphabetic letter. Zero (i.e., false) otherwise.

如果c确实是小写字母,则值与零不同(即true)。否则为零(即false)

上面的每一个函数的表达式几乎一样,这里不再赘述,注意还是要看看返回值的含义

而且,发现了没有参数是int但是功能却是判断字符串

主要是中间其实发生了类型转换,本身int类型是大于char类型的

1.2字符转换函数

我们在这里讲解两个

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

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

值得注意的是,他是完全可以有我们自主实现的

那么,我们可以模拟实现该函数

当然我们上一个代码其实就是它的模拟实现

所以,我们只是举一个例子就好

#include<ctype.h>
#include<stdio.h>
int main()
{
char a[]="jdkalkdkjakldkj\n";
int i=0;
while(a[i])
{
toupper(a[i]);
puchar(a[i])
i++;
}
return 0;
}

这个代码就是把小写字母变为大写字母

2字符串函数

2.1 strlen 的使⽤和模拟实现

定义

size_t strlen ( const char * str );

作用计算字符串的长度

字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数 不包 含 '\0' 

参数指向的字符串必须要以 '\0' 结束。

注意函数的返回值为 size_t,是⽆符号的( 易错 )

strlen的使⽤需要包含头⽂件

1strlen的使用

看代码

#include<string.h>
#include<stdio.h>
int main()
{

char a[]=“jdlkalkdjkllkakldjkl”;
strlen(a);
return 0;
}

其实这个代码就是计算了字符串的长度

2模拟实现

分析 首先strlen函数得要接收一个地址类型是char *

返回一个无符号的数代表该字符串的长度

代码1实现

size_t My_strlen(const char* dest)
{
	assert(dest);
	int count = 0;
	while (*dest++)//当* dest为\0时 它的ASCLL码值为0
	{
		count++;
	}
	return count;
}
int main()
{
	char a[] = "jkaldkljda";
	printf("%zd\n", My_strlen(a));
	printf("%zd\n", strlen(a));
	return 0;
}

看结果

代码2实现

size_t My_strlen(const char* dest)
{
	assert(dest);
	char* p1 = (char *)dest;
	while (*dest++);//当* dest为\0时 它的ASCLL码值为0
	return dest-p1-1;
}
int main()
{
	char a[] = "jkaldkljdadakjkjlaksc";
	printf("%zd\n", My_strlen(a));
	printf("%zd\n", strlen(a));
	return 0;
}

其实就是把最后结果变为 指针-指针

但是由于*dest为‘\n’时有后置加加所以要多减去一个1

结果是一样的

2.2strcpy 的使⽤和模拟实现

• Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).

• 源字符串必须以 '\0' 结束

• 会将源字符串中的 '\0' 拷⻉到⽬标空间

• ⽬标空间必须⾜够⼤,以确保能存放源字符串

• ⽬标空间必须可修改

上面同样是注意事项

1strcpy的使用

int main()
{
	char a[10] = "djklak";
	char b[20] = { 0 };
	strcpy(b, a);
	printf("%s", b);
	return 0;
}

2strcpy的模拟实现

char *strcpy( char *strDestination, const char *strSource );

返回值为目的地址

看代码

char *My_strcpy(char *dest,const char *src)
{
	assert(dest && src);
	char* p1 = dest;
	while (*dest++ = *src++);
	return p1;
}

看结果

3.3.strcat 的使⽤和模拟实现

• Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.

源字符串必须以 '\0' 结束 ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。

⽬标空间必须可修改。

1strcat的使用

看代码

int main()
{
	char a[20] = "hello";
	char b[10] = " world";
	strcat(a, b);
	printf("%s\n", a);
	return 0;
}

2strcat的模拟实现

char *strcat( char *strDestination, const char *strSource );

char* My_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	while (*(++dest));
	while (*dest++ = *src++);
	return ret;
}
int main()
{
	char a[20] = "hello";
	char b[10] = " world";
	char c[20] = "hello";
	My_strcat(a, b);
	strcat(c, b);
	printf("%s\n", a);
	printf("%s\n", c);
	return 0;
}

看结果

3.4strcmp 的使⽤和模拟实现

• This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminating null-character is reached.

•标准规定:第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字 ◦ 第⼀个字符串等于第⼆个字符串,则返回0 

第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字 

那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩

1strcmp的使用

int main()
{
	char* a = "jdkajkd";
	char* b = "djajdascdad";
	int flag = strcmp(a, b);
	if (flag > 0)
		printf("第一个字符串大\n");
	else if (flag == 0)
		printf("两个一样大\n");
	else
		printf("第二个字符串的\n");
	return 0;
}

2strcmp的模拟实现

int strcmp( const char *string1, const char *string2 );

int My_strcmp(const char* string1,const char *string2)
{
	assert(string1 && string2);
	while (*string1 && *string2)
	{
		if (*string1 == *string2)
		{
			string1++; string2++;
		}
		else
			break;
	}
	return *string1 - *string2;
}
int main()
{
	char* a = "jdkajkd";
	char* b = "djajdascdad";
	int flag1=strcmp(a, b);
	int flag2 = My_strcmp(a, b);
	if (flag1*flag2>=0)
		printf("模拟成功\n");
	if (flag1 > 0)
		printf("第一个字符串大\n");
	else if (flag1== 0)
		printf("两个一样大\n");
	else
		printf("第二个字符串大\n");
	return 0;
}

看结果

3.5strncat 的使⽤和模拟实现

strncat就是多了个参数,限定copy的字符串大小

将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字 符

如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾

1strncat的使用

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

2strncat的模拟实现

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

char *My_strncat(char *dest,const char *src,size_t n)
{
	char* ret = dest;
	assert(dest && src);
	while (*(++dest));
	while (n--&&*src)
	*dest++ = *src++;
	*dest = '\0';
	return ret;
}
int main()
{
	char str1[20];
	char str2[20];
	char str3[20];
	strcpy(str1, "To be ");
	strcpy(str2, "or not to be");
	strcpy(str3, "To be ");
	My_strncat(str1, str2, 6);
	strncat(str3, str2, 6);
	printf("%s\n", str1);
	printf("%s\n", str3);
	return 0;
}

看结果

3.6strncmp的使⽤和模拟实现

⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.

1strncmp的使用

#include <stdio.h>
#include <string.h>
int main ()
{
 char *p1="abcde";
 char *p2="abcfe";
 int a=strncmp(p1,p2,3);
if(a>0)
printf("第一个字符串在前3个字符中更大\n");
else if(a=0)
printf("两个字符串在前3个字符中一样大\n");
else
printf("第二个字符串在前3个字符中更大\n");
 return 0;
} 

2strncmp模拟实现

int My_strncmp(const char* str1, const char* str2,size_t n)
{
	assert(str1 && str2);
	while (n--&& *str1 && *str2)
	{
		if (*str1 == *str2)
		{
			str1++; str2++;
		}
	}
	return *str1 - *str2;
}
int main()
{
	char* p1 = "abcde";
	char* p2 = "abcfe";
	int a = strncmp(p1, p2, 3);
	int b = My_strncmp(p1, p2, 3);
	if (a * b >= 0)
		printf("模拟成功\n");
	if (a > 0)
		printf("第一个字符串在前3个字符中更大\n");
	else if (a==0)
		printf("两个字符串在前3个字符中一样大\n");
	else
		printf("第二个字符串在前3个字符中更大\n");
	return 0;
}

看结果

3.7strstr 的使⽤和模拟实现

1strstr的使用

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

函数返回字符串str2在字符串str1中第⼀次出现的位置

字符 串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志

#include <stdio.h>
#include <string.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;
} 

2strstr模拟实现

int main()
{
	char *p=strstr("abcdefg","cd");
	printf("%s", p);
	return 0;
}
//2模拟实现一下
char* My_strstr(const char* p1, const char* p2)
{
	const char* cur=p1;
	const char* p3=p2;
	while (*cur)
	{
		cur = p1;
		p3 = p2;
		while ((*p3&&*cur)&&*cur++==*p3++)
		if (!*p3)
			return (char*)p1;
		if (*cur)
			p1++;
		else
			return NULL;
	}
	return NULL;
}

看结果

总结

这几个字符串函数的模拟实现花了不少时间才手打完

ok祝大家开心

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/469488.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试经验与教训

大概在18年的时候&#xff0c;就看过《软件测试经验与教训》的纸制版&#xff0c;里面的一些观点深刻的影响了我&#xff0c;也影响了后来我对测试的思考。最近又一次快速阅读了电子版&#xff0c;还是收获满满。下面精选出10条&#xff0c;和大家分享。 一、测试人员是项目的…

testng测试类第2步

创建xml文件并编写xml文件 并学习其中的参数 1、创建 xml文件 在测试包->右键找到creat TestNG XML 创建xml文件 如果报错就可以粘贴过来 认识原始文件 这里首行是标识&#xff0c;其次是2个参数&#xff0c;name是测试套件的名称&#xff0c;谁的测试套件一般是公司名称…

JAVA实战手册-开篇总述

该专题以实战为出发点&#xff0c;总结概述了实际工作中常用的java知识点&#xff0c;掌握了这些知识点&#xff0c;日常工作开发以及面试都不在话下。 话不多说&#xff0c;直入正题&#xff0c;以下为JAVA知识点概括总结&#xff08;总计涵盖了10大类78小项&#xff09; 针对…

AcWing 727. 菱形——像拼图一样做题

题目描述] 分析&#xff1a; 利用程序根据输入的整数&#xff0c;画出由字符*构成的该整数阶的实心菱形。给出一个示例&#xff1a; n 7 n7 n7。 * * * * * * * * * * * * * * * * * * * * * * * * * 我们将采取拆解问题&#xff0c;通过四个部分的…

Linux编程4.7 网络编程-套接字与地址

1、因特网地址结构 struct in_addr{in_addr_t s_addr; /*ipv4地址*/ }struct sockaaddr_in{short int sin_family; /*Internet地址族&#xff0c;如AF_INET&#xff08;主机字节序&#xff09;*/ unsigned short int sin_port; /*端口号&#xff0c;16…

upload-labs第二关第五关

upload-labs第二关 1、先上传个马试试&#xff0c;看看页面显示什么&#xff0c;要先把上次上传的马删掉哦 2、提示文件类型不正确&#xff0c;在看下提示说是在服务端做了检查 3、那就上传个php格式的&#xff0c;然后呢bp抓包把文件格式改了 4、修改后的 5、修改后发现不…

【物联网】Modbus 协议及应用

Modbus 协议简介 QingHub设计器在设计物联网数据采集时不可避免的需要针对Modbus协议的设备做相关数据采集&#xff0c;这里就我们的实际项目经验分享Modbus协议 简介 Modbus由MODICON公司于1979年开发&#xff0c;是一种工业现场总线协议标准。1996年施耐德公司推出基于以太…

ansible 运维自动化

pxe 一键安装操作系统 操作系统只是提供一个平台 lnmp 需要多软件协同完成的一个简单项目 服务器正常运行 日常运维 巡检 服务器上的软件正常运行 zabbix 普罗米修斯 系统调优&#xff0c;架构调优 前言 运维自动化 云计算核心职能 搭建平台架构 …

TCPIP协议总结

一、TCP的三次握手 TCP连接的建立时&#xff0c;双方需要经过三次握手&#xff0c;而断开连接时&#xff0c;双方需要经过四次分手&#xff0c;那么&#xff0c;其三次握手和四次分手分别做了什么呢&#xff1f;又是如何进行的呢&#xff1f; 通常情况下&#xff0c;建立连接的…

从零开始学习如何使用 Postman 请求头

当你在使用 Postman 发送请求时&#xff0c;请求头&#xff08;Headers&#xff09;是你可以包含在 HTTP 请求中的重要部分之一。请求头包含了关于请求的元数据信息&#xff0c;这些信息对于服务器来处理请求是非常重要的。下面是一份详细的图文介绍&#xff0c;说明了如何在 P…

电商数据采集效率开挂【Python电商数据采集API接口】

数据监测 监测线上电商平台的商品、店铺数据&#xff0c;包括商品销量/库存/价格/店铺等级/发货地/促销活动等信息&#xff0c;支持十多个国内主流电商平台。 在线维权 实现多平台在线一键投诉&#xff0c;与各大电商投诉平台系统对接&#xff0c;实时同步投诉进展。 渠道管…

C# visual studio 2022 学习2

类成员&#xff1a; 1.字段成员 字段只是类中声明的一个变量&#xff0c;用来在对象中存储信息。 &#xff08;1&#xff09;.静态字段 使用static关键字修饰的就是静态字段&#xff0c;静态字段属于类而不属于某个类实例&#xff0c;对它的访问使用“类名.静态字段名” &…

28-2 文件上传漏洞 - 双写绕过

环境准备&#xff1a;构建完善的安全渗透测试环境&#xff1a;推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、双写绕过原理 在代码编写过程中&#xff0c;双写绕过原理指的是只对黑名单中的内容进行一次空替换。由于只进行一次替换&#xff0c;导致了双写绕过的情况…

数据结构从入门到精通——排序的概念及运用

排序的概念及运用 前言一、排序的概念排序稳定性内部排序外部排序 二、排序运用三、常见的排序算法四、排序性能检测代码srand()clock() 五、oj排序测试代码 前言 排序是将数据按照一定规则重新排列的过程&#xff0c;常见规则有升序、降序等。排序算法如冒泡排序、快速排序等…

JavaScript中的继承方式详细解析

什么是继承 继承是面向对象编程中的一个重要概念&#xff0c;它指的是一个对象&#xff08;或类&#xff09;可以获得另一个对象&#xff08;或类&#xff09;的属性和方法。在继承中&#xff0c;被继承的对象通常称为父类&#xff08;或基类、超类&#xff09;&#xff0c;继…

C++关键字:static

文章目录 一、static的四大用法1.静态局部变量2.静态全局变量3.静态函数4.类中的 静态成员变量、静态成员函数 一、static的四大用法 1.静态局部变量 延长局部变量的生命周期。 1.与普通的局部变量不同&#xff0c;局部静态变量在函数调用结束之后&#xff0c;不会被销毁&am…

中国银联订单支付产品实施指南(2022.A 版)

为落实总行提出以银行账户为基础&#xff0c;全面提升对小微企业、民营企业的支付结算服务能力和水平的总体思路要求&#xff0c;践行支付为民&#xff0c;银联提出建设订单支付产品&#xff0c;通过深度融合企业线上线下支付场景&#xff0c;充分赋能商业银行B2B业务支付结算&…

数据结构奇妙旅程之红黑树

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

“团团活力圈”--“书香润童心 阅读伴成长”青少年读书分享活动

书籍是人类进步的阶梯&#xff0c;读书能够陶冶人的情操、开阔眼界&#xff0c;同时&#xff0c;通过读书&#xff0c;能够帮助人们增长知识&#xff0c;培养正确的人生观、价值观。为了帮助青少年多读书&#xff0c;感受读书的乐趣&#xff0c;3月17日&#xff0c;在共青团中央…

【代码】YOLOv8标注信息验证

此代码的功能是标注信息验证&#xff0c;将原图和YOLOv8标注文件&#xff08;txt&#xff09;放在同一个文件夹中&#xff0c;作为输入文件夹 程序将标注的信息还原到原图中&#xff0c;并将原图和标注后的图像一同保存&#xff0c;以便查看 两个draw_labels函数&#xff0c;分…