30.字符串处理函数

news2024/9/28 23:38:22

文章目录

  • 1.测字符串长度函数
  • 2.字符串拷贝函数
      • 1.strcpy函数
      • 2.strncpy函数
  • 3.字符串追加函数
      • 1.strcat函数
      • 2.strncat函数
  • 4.字符串比较函数
      • 1.strcmp函数
      • 2.strncmp函数
  • 5.字符查找函数
      • 1.strchr函数
      • 2.strrchr函数
  • 6.字符串匹配函数
  • 7.空间设定函数
  • 8.字符串转换数值
  • 9.字符串切割函数
      • strtok函数练习

#pragma 指令的作用是:用于指定计算机或操作系统特定的编译器功能。
#pragma warning(disable:4996) 在c文件开始处写上这句话,即告诉编译器忽略4996警告,strcpy,scanf等一些不安全的标准c库函数在vs中就可以使用了。

1.测字符串长度函数

  • 头文件:#include<string.h>
  • 函数定义:size_t strlen(const char* s);
  • 函数功能:计算字符指针s指向的字符串中字符的个数,不包括’\0’。
  • 返回值:字符串中字符的个数。
#include<stdio.h>
#include<string.h>
//#pragma warning(disable:4996)
int main()
{
	char str1[20] = "hello";
	char* str2="hello";
	printf("sizeof(str1)=%d\n", sizeof(str1));
	printf("sizeof(str2)=%d\n", sizeof(str2));

	printf("strlen(str1)=%d\n", strlen(str1));
	printf("strlen(str2)=%d\n", strlen(str2));
	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.字符串拷贝函数

  • 头文件:#include<string.h>

1.strcpy函数

  • 函数的声明:char* strcpy(char* dest,const char* src);
  • 函数的说明:拷贝src指向的字符串到dest指针指向的内存中,'\0’也会拷贝。
  • 函数的返回值:目的内存的地址。

注意:在使用此函数时,必须保证dest指向的内存空间足够大,否则会出现内存污染。

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str[100] = "aaaaaaaaaaaaaaaaaaaaaaaa";
	strcpy(str, "hello");
	printf("str=%s\n", str);
	printf("str+6=%s\n", str+6);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

2.strncpy函数

  • char* strncpy(char* dest, const char* src, size_t n);
  • 函数说明:将src指向的字符串前n个字节拷贝到dest指向的内存中。
  • 返回值:目的内存的首地址。

注意:

  • strncpy不拷贝’\0’。
  • 如果n大于src指向的字符串中的字符个数,则在dest后面填充n-strlen(src)个’\0’。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char buf[100] = "aaaaaaaaaaaaaaaaaaaa";
	strncpy(buf, "hello", 5);
	printf("buf=%s\n", buf);
	return 0;
}

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char buf[100] = "aaaaaaaaaaaaaaaaaaaaaaaaaa";
	int len,i;
	len = strlen(buf);
	strncpy(buf, "helloworld", 15);
	printf("buf=%s\n", buf);
	for (i = 0; i < len; i++)
	{
		printf("buf[%d]=%c ",i,buf[i]);
		if (i % 5 == 0) {
			printf("\n");
		}
	}
	return 0;
}

在这里插入图片描述

3.字符串追加函数

  • 头文件:#include<string.h>

1.strcat函数

  • 函数声明:char* strcat(char* dest, const char* src);
  • 函数功能:strcat函数追加src字符串到dest指向的字符串后面。追加的时候会追加’\0’。
  • 注意:保证dest指向的内存空间足够大。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str[100] = "aa\0aaaaaaaaaaaaaaaaaaa";
	strcat(str, "hello");
	printf("str=%s\n", str);
	return 0;
}

在这里插入图片描述

2.strncat函数

  • char* strncat(char* dest, const char* src, size_t n);
  • 追加src指向的字符串的前n个字符,到dest指向的字符串后面。
  • 注意如果n大于src字符的个数,则只将字符串追加到dest指向的字符串后面。追加的时候会追加’\0’。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str[100] = "aa\0aaaaaaaaaaaaaaaaaaa";
	char* src = "hello";
	strncat(str,src,3);
	printf("str=%s\n", str);
	return 0;
}

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str[100] = "aa\0aaaaaaaaaaaaaaaaaaa";
	char* src = "hello";
	strncat(str,src,15);
	printf("str=%s\n", str);
	printf("str+8=%s\n", str + 8);
	return 0;
}

在这里插入图片描述

4.字符串比较函数

头文件:#include<string.h>

1.strcmp函数

  • 函数声明:int strcmp(const char* s1, const char* s2);
  • 函数说明:比较s1和s2指向的字符串的大小。逐个字符比较ASCII 码,一旦比较出大小就返回。如果所有字符都一样,则返回0。
  • 返回值:如果s1指向的字符大于s2指向的字符,返回1。如果s1指向的字符小于s2指向的字符,返回-1 。如果相等返回0.
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char* str1 = "hello world";
	char* str2 = "hello worlda";
	int ret;
	ret = strcmp(str1, str2);
	if (ret > 0)
		printf("str1指向的字符串大于str2指向的字符串\n");
	else if(ret<0)
		printf("str1指向的字符串小于str2指向的字符串\n");
	else
		printf("两个字符串相等\n");
	printf("ret=%d\n", ret);
	return 0;
}

在这里插入图片描述

2.strncmp函数

  • int strncmp(const char* s1,const char* s2, size_t n);
  • 函数说明:比较s1和s2指向的字符串中前n个字符。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char* str1 = "hello world";
	char* str2 = "hello kitty";
	int ret;
	ret = strncmp(str1, str2, 5);
	if (ret > 0)
		printf("str1的前5个字符大于str2的前5个字符\n");
	else if(ret < 0)
		printf("str1的前5个字符小于str2的前5个字符\n");
	else
		printf("两个字符串前5个字符相等\n");
}

在这里插入图片描述

5.字符查找函数

  • 头文件:#include<string.h>

1.strchr函数

  • 函数声明:char* strchr(const char* s, int c);
  • 函数说明:在字符指针s指向的字符串中,找ASCII码为c的字符。
  • 返回值:找到返回字符的地址。找不到返回NULL。

注意:是首次匹配,如果说s指向的字符串中有多个ASCII为c的字符,则找的是第一个字符的返回值。

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char* str = "helloworldhelloworldhelloworld";
	char* p;
	p = strchr(str, 'w');
	if (p == NULL)
	{
		printf("没有您要找的字符");
		return 0;
	}
	printf("p-str=%d\n", p - str);
	return 0;
}

在这里插入图片描述

2.strrchr函数

  • 函数声明:char* strrchr(const char* s,int c);
  • 函数说明:末次匹配。在s指向的字符串,找出最后一次出现的ASCII为c的字符。
  • 返回值:末次匹配的字符的地址。找不到返回NULL。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char* str = "helloworldhelloworldhelloworld";
	char* p;
	p = strrchr(str, 'w');
	if (p == NULL)
	{
		printf("没有您要找的字符");
		return 0;
	}
	printf("p-str=%d\n", p - str);
	return 0;
}

在这里插入图片描述

6.字符串匹配函数

  • #include<string.h>
  • char* strstr(const char* haystack,const char* needle);
  • 函数说明:在haystack指向的字符串中查找needle指向的字符串,也是首次匹配。
  • 返回值:找到返回字符串的首地址,没找到返回NULL。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str1[100] = "dfjk$#$adjkwfha$#$dwadaf";
	char str2[100] = "$#$";
	char* p;
	p = strstr(str1, str2);
	if (p == NULL)
	{
		printf("没有您要查找的字符串\n");
		return 0;
	}
	printf("p-str1=%d\n", p - str1);
	return 0;
}

在这里插入图片描述

7.空间设定函数

头文件:#include<string.h>

  • 函数声明:void* memset(void* ptr, int value, size_t num);
  • 函数功能:memset函数是将ptr指向的内存空间的num个字节全部赋值为value。
  • 参数:ptr:指向任意类型的指针,即指向我们需要修改的内存。value:给ptr指向的内存空间赋的值。num:确定将ptr所指向的内存中的num个字节全部用value代替。
  • 返回值:目的内存的首地址,即ptr的值。
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str[100] = "helloworld";
	memset(str, '\0', 100);
	printf("str=%s\n", str);
	memset(str, 'a', 5);
	printf("str=%s\n", str);
	return 0;
}

在这里插入图片描述

8.字符串转换数值

  • atoi/atol/atof //字符串转换功能
  • 头文件:#include<stdlib.h>
  • 函数的声明:int atoi(const char* nptr);
  • 函数的功能:将nptr指向的字符串转换成整型返回。
  • 返回值:转换后的整数,此值由将输入的字符作为数字解析而成。如果该输入无法转换成该类型的值,则返回值为0。
#include<stdio.h>
#include<stdlib.h>
#pragma warning(diable:4996)
int main()
{
	int num;
	num = atoi("123");
	printf("num=%d\n", num);
	num = atoi("abc");
	printf("num=%d\n", num);
	return 0;
}

在这里插入图片描述
long atol(const char* nptr);
double atof(const char* nptr);

9.字符串切割函数

  • 头文件:#include<string.h>
  • 函数声明:char* strtok(char* str,const char* delim);
  • 函数的功能:字符串切割,按照delim指向的字符串中的字符,切割str指向的字符串。其实就是在str指向的字符串中发现了delim字符串中的字符,就将其变成’\0’,调用一次strtok只切割一次,切割一次后,再去切割的时候strtok的第一个参数传NULL,意思是接着上次的切割位置继续切。

注意:如果str字符串中出现了连续几个delim中的字符,则只将第一个字符变成’\0’。

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
	char str[100] = "xiaoming:21,,,.男.女,北京:haidian";
	char* p[7];
	int i = 0,j;
	printf("str=%s\n", str);
	p[i] = strtok(str, ":,.");
	printf("p[%d]=%s\n", i, p[i]);
	printf("str=%s\n", str);
	while (p[i] != NULL) {
		i++;
		p[i] = strtok(NULL, ":,.");
	}
	for (j = 0; j < i; j++)
	{
		printf("p[%d]=%s\n", j, p[j]);
	}
	printf("p[1]+3=%s\n", p[1] + 3);
	return 0;
}

在这里插入图片描述

strtok函数练习

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
int msg_deal(char* msg_src, char* msg_done[], char* str)
{
	int i = 0;
	msg_done[i] = strtok(msg_src, str);
	while (msg_done[i] != NULL)
	{
		i++;
		msg_done[i] = strtok(NULL, str);
	}
	return i;
}
int main()
{
	char s[100] = "+CMGR:REC UNREAD,+8613466630259,98/10/01,18:22:11+00,ABCdefGHI";
	char* p[6];
	int num,i;
	num = msg_deal(s, p, ",");
	printf("num=%d\n", num);
	for (i = 0; i < num; i++)
	{
		printf("p[%d]=%s\n",i, p[i]);
	}
	printf("手机号:%s\n", p[1] + 3);
	printf("日期:%s\n", p[2]);
	*(p[3] + 8) = '\0';
	printf("时间:%s\n", p[3]);
	printf("内容:%s\n", p[4]);
	return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java开发】Spring Cloud 04 :服务治理Nacos

本章节正式进入 Spring Cloud 环节了&#xff0c;首先介绍微服务架构中一个最重要的原理概念&#xff1a;服务治理&#xff0c;在概念讲解之后&#xff0c;讲解介绍 Nacos 服务注册中心的体系结构。1 服务治理1.1 服务治理介绍首先通过一个例子告诉你服务治理解决了什么问题。比…

GD32F4——外部中断

一、NVIC中断系统 Cortex-M4集成了嵌套式矢量型中断控制器&#xff08;Nested Vectored Interrupt Controller&#xff0c;NVIC&#xff09;来实现高效的异常和中断处理。 中断系统包含外部中断、定时器中断、DMA中断和串口中断等。 二、EXTI外部中断 EXTI&#xff08;中断…

go的基本语法介绍之变量的声明与初始化

1.常见基本数据类型 uint8&#xff1a;无符号8位整形&#xff0c;取值范围&#xff1a;0-255 uint16&#xff1a;无符号16位整形&#xff0c;取值范围&#xff1a;0-65535 uint32&#xff1a;无符号32位整形&#xff0c;取值范围&#xff1a;0-4294967295 uint64&#xff1…

opencv arm交叉编译与仿真验证详细流程

【关键内容】 1.将opencv编译为能在arm上运行的库 2.在没有板子的情况下&#xff0c;仿真验证opencv库 1.将opencv编译为能在arm上运行的库 1.在下方链接中选择某个版本 Releases - OpenCVhttps://opencv.org/releases/点击“Sources”即可开始下载&#xff0c;得到opencv-…

「数据结构、逻辑结构、物理结构」基本概念简析

前言 前言&#xff1a;简析数据结构、逻辑结构、物理结构。 文章目录前言一、数据结构1. 简介2. 数据3. 结构4. 分析5. 分类1&#xff09;线性结构&#xff08;线性表&#xff09;2&#xff09;树结构3&#xff09;图结构二、逻辑结构与物理结构1. 为什么要有逻辑结构和物理结构…

【leetcode合集】如何知道自己是否掌握了数组与链表?试试这几道题目吧!

目录 1.数组题目合集 1.1 leetcode.27 移除元素 1.2 leetcode.26 删除有序数组中的重复项 1.3 leetcode.88 合并两个有数数组 2.链表题目合集 2.1 leetcode.203 移除链表元素 2.2 leetcode.206 反转链表 2.3 leetcode.876 链表的中间结点 2.4 牛客 链表中倒数第k个结点…

零基础学JavaWeb开发(十七)之 mybatis(2)

5、MyBatis - 映射文件标签 5.1、映射文件的顶级元素 select&#xff1a;映射查询语句 insert&#xff1a;映射插入语句 update&#xff1a;映射更新语句 delete&#xff1a;映射删除语句 sql&#xff1a;可以重用的 sql 代码块 resultMap&#xff1a;最复杂&#xff0c…

章鱼网络 2022 虎年全回顾

全长5606字&#xff0c;预计阅读20分钟2022年对章鱼网络而言颇为特别。这是章鱼网络建设应用链多链生态历程的第一年&#xff0c;整个 Web3 行业都经历了极其糟糕的市场环境&#xff0c;但是我们在「生态建设」、「基础设施优化」、「社区治理」和「市场拓展」等都有长足进展&a…

31.Isaac教程--规划器代价

规划器代价 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录规划器代价组件入门通过应用程序图自定义成本导航本地规划器基于线性二次调节器 (LQR) 规划器。 它通过生成最小化成本函数的轨迹来工作。 不幸的是&#xff0c;没有适用于所有…

Allegro如何输出第三方网表操作指导

Allegro如何输出第三方网表操作指导 在做PCB设计的时候,会需要输第三方网表,Allegro支持快速输出第三方网表,如下图 具体操作如下 选择File选择Export

Leetcode:39. 组合总和、40. 组合总和 II(C++)

目录 39. 组合总和&#xff1a; 问题描述&#xff1a; 实现代码与解析&#xff1a; 回溯&#xff1a; 原理思路&#xff1a; 剪枝版&#xff1a; 40. 组合总和 II&#xff1a; 问题描述&#xff1a; 实现代码与解析&#xff1a; 回溯&#xff1a; 原理思路&#xff…

函数——“C”

各位CSDN的uu们新年快乐呀&#xff0c;祝大家越来越开心&#xff0c;越来越优秀。那行&#xff0c;让我们进入今天的正题&#xff0c;来了解了解函数&#xff0c;函数是什么&#xff0c;C语言中函数是如何分类的&#xff0c;函数参数&#xff0c;函数调用等一系列小知识点&…

文件操作详解-IO

目录 1.认识文件 2.文件的类型 3.java对文件的操作 针对文件系统操作 针对文件内容操作 字节流 字符流 字节流的使用 字符流的使用 4.文件IO小程序练习 示例1 示例2 1.认识文件 狭义的文件指的是硬盘上的文件和目录 广义的文件泛指计算机中的很多的软硬件资源,操…

3小时精通opencv(二)图片的常用操作

3小时精通opencv(二)图片的常用操作 参考视频资源:3h精通Opencv-Python 文章目录3小时精通opencv(二)图片的常用操作灰度图像高斯滤波边缘检测膨胀函数腐蚀函数整体代码灰度图像 img cv2.imread(Resources/lena.png) imgGray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.im…

【C++】位图 | 布隆过滤器

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;哈希函数…

添加选课模块分析

1 模块需求分析 1.1 模块介绍 本模块实现了学生选课、下单支付、学习的整体流程。 网站的课程有免费和收费两种&#xff0c;对于免费课程学生选课后可直接学习&#xff0c;对于收费课程学生需要下单且支付成功方可选课、学习。 选课&#xff1a;是将课程加入我的课程表的过…

论文投稿指南——中文核心期刊推荐(水利工程)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

大展宏图、首创基于.NET 7强大内核-Zoomla!逐浪CMS v8.7.0发布

2022年底&#xff0c;微软 .NET Conf 在线活动正式开幕。作为微软开源、跨平台开发平台&#xff0c;.NET 7 现已推出首个正式版&#xff0c;这也代表微软的“统一工作”终于完成。 使用 .NET 7 可以轻松地将 .NET 7 项目容器化&#xff0c;在 GitHub 操作中设置 CI / CD 工作流…

拔高法三视图

拔高法最主要的就是俯视图&#xff0c;是三视图的根基&#xff0c;看主视图和侧视图&#xff0c;顶点位置在底面(俯视图)范围内&#xff0c;不在则不能拔高&#xff1b;俯视图有虚线不能拔高 首先标出俯视图所有结点&#xff0c;并且画出俯视图所对应的直观图。用斜二测画法 …

Spring Cloud 中的OpenFeign+Ribbon详解

1 spring cloud 远程调用没有看过的小伙伴可以点击传送门先去了解Nacos。有了Nacos做注册中心后&#xff0c;我们就可以获取其他服务的地址进行调用了。远程调用就需要用到我们今天的主角OpenFeign&#xff0c;如果被调用服务存在多个实例就需要进行负载均衡&#xff0c;负载均…