解析spritf和sscanf与模拟常用字符串函数strchr,strtok(二)

今天又来继续我们的字符串函数的文章,这也是最后一篇了。希望这两篇文章能让各位理解透字符串函数。

目录

strchr

strtok

sprintf和sscanf 



strchr

 
  strchr  是一个用于在字符串中查找特定字符首次出现位置的函数。以下是解析和模拟实现  strchr  函数的示例:
 
解析  strchr  函数:
 
 


#include <stdio.h>// 解析 strchr 函数
void parse_strchr() {const char *string = "Hello, World!";char target = 'l';// 使用 strchr 函数查找字符const char *found = strchr(string, target);if (found != NULL) {printf("Character '%c' found at index: %zu\n", target, found - string);} else {printf("Character '%c' not found in string\n", target);}
}int main() {parse_strchr();return 0;
}


 
在上述示例中,我们定义了一个字符串  string  和要查找的目标字符  target 。然后,使用  strchr  函数在字符串中查找目标字符,并将找到的位置存储在  found  变量中。根据  found  是否为  NULL ,我们输出相应的结果。
 
模拟实现  strchr  函数:
 
 

#include <stdio.h>// 模拟实现 strchr 函数
const char * my_strchr(const char * string, char target)
{for (; *string  != '\0'; string++){if (*string == target){return string;}}return NULL;
}int main() {const char * string = "Hello, World!";char target = 'l';// 使用模拟的 my_strchr 函数查找字符const char * found = my_strchr(string, target);if (found != NULL){printf("Character'%c'found at index:%zu\n", target, found - string);}else {printf("Character'%c' not found in string\n", target);}return 0;
}


 
 
在模拟实现中,我们使用一个循环遍历字符串中的每个字符。如果找到了与目标字符匹配的字符,就返回该字符的地址。如果循环结束后仍未找到,返回  NULL 。
 
这两种方法(解析和模拟实现)都可以用来在字符串中查找特定字符。使用标准库中的  strchr  函数通常更方便和可靠,但模拟实现可以帮助你更好地理解其工作原理。
 
 


strtok

 strtok  是一个用于分割字符串的函数。它根据指定的分隔符将字符串分割成多个部分,并可以逐个提取这些部分。
 
下面是模拟和解析  strtok  函数的示例:

解析  strtok  函数:

#include <stdio.h>
#include <string.h>// 解析 strtok 函数
void parse_strtok() {char string[] = "apple,banana,cherry";char delimiter[] = ",";// 使用 strtok 函数分割字符串char * token = strtok(string, delimiter);while (token != NULL) {printf("%s\n", token);token = strtok(NULL, delimiter);}
}int main() {parse_strtok();return 0;
}


 
 

 
在这个示例中,我们直接使用了标准库中的  strtok  函数来分割字符串,并打印每个部分。
 
模拟  strtok  函数:
 
 

#include <stdio.h>
#include <string.h>// 模拟 strtok 函数
char * my_strtok(char * str, const char * delimiter) 
{static char* token = NULL;if (str  == NULL) {return NULL;}while (1){// 查找下一个分隔符的位置char* next = strstr(str, delimiter);// 如果找到分隔符if (next != NULL) {*next = '\n';}else if (next == NULL)break;}token = str;return token;
}int main() {char string[] = "apple,banana,cherry";char delimiter[] = ",";// 使用模拟的 my_strtok 函数分割字符串char * token = my_strtok(string, delimiter);while (token != NULL) {printf("%s\n", token);token = my_strtok(NULL, delimiter);}return 0;
}


在上述示例中,我们模拟了  strtok  函数的行为。通过使用  strstr  函数查找分隔符的位置,并将其设置为字符串的换行符。然后,返回找到的下一个部分的指针。
 


 
无论是模拟还是直接使用  strtok ,它们的基本原理都是根据指定的分隔符将字符串分割成多个部分。需要注意的是, strtok  函数会修改原始字符串,并且在多次调用时需要注意处理  NULL  指针的情况。


sprintf和sscanf
 
 

 sprintf 是一个变参函数,用于格式化字符串并将结果写入到指定的缓冲区中,其函数声明为 int sprintf(char *buffer, const char *format, ...) 。下面是对各参数的详细解释:
 
-  buffer :是 char 类型的指针,指向要写入的字符串的指针。
-  format :格式化字符串,即在程序中指定的格式。
-  argument :可选参数,可以为任意类型的数据,可以有一个或多个参数。

 
该函数的返回值是写入到缓冲区中的字符数,不包括字符串结尾的空字符 \0 。下面是一些常见的用法示例:
 
- 格式化数字字符串:
 
 

// 把整数123打印成一个字符串保存在s中
sprintf(s, "%d", 123); 
// 产生 "123"


 
 
- 控制浮点数打印格式:
 
 

// 保留小数点后6位数字
sprintf(s, "%f", 3.1415926); 
// 产生 "3.141593"


 - 连接字符串:

 
 

// 连接字符串
char *who = "I"; 
char *whom = "52PHP"; 
sprintf(s, "%s love %s.", who, whom); 
// 产生 "I love 52PHP. " 


 
 
- 打印整数和浮点数时可以指定宽度:
 
 

// 指定宽度
char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'}; 
char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'}; 
sprintf(s, "%.7s%.7s", a1, a2); 
// 产生 "ABCDEFGHIJKLMN" 


 
 
需要注意的是, sprintf 函数在字符串中插入变量时不会进行边界检查,如果格式化字符串和变参列表不匹配,可能会导致缓冲区溢出或其他问题。因此,在使用 sprintf 函数时,应确保格式化字符串和变参列表的匹配,并确保缓冲区的大小足够容纳输出结果。



  sscanf 函数是一个用于从字符串中读取数据的 C 语言函数,与 scanf 函数类似,但是它的输入源是一个字符串而不是标准输入。 sscanf 函数的声明如下:
 

 

int sscanf(const char *str, const char *format, ...)


 
 
参数说明:
 
-  str :这是 C 字符串,是函数检索数据的源。
-  format :这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符 。
-  ... :这是可变参数,为对应的附加参数所指向的数据指定一个不同于整型(针对 d、i 和 n)、无符号整型(针对 o、u 和 x)或浮点型(针对 e、f 和 g)的大小。

 
该函数会将参数 str 的字符串根据参数 format 字符串来转换并格式化数据,转换后的结果存于对应的参数内。返回值为成功匹配和赋值的个数,如果没有成功匹配的项,则返回 0 。
 
下面是一些常见的用法示例:
 
- 从字符串中读取一个字符:
 
 

char c;
sscanf("Hello", "%c", &c);


 
 
- 从字符串中读取一个整数:
 
 

int i;
sscanf("12345", "%d", &i);


 
- 从字符串中读取一个浮点数:
 
 

float f;
sscanf("3.1415", "%f", &f);


 
 
- 从字符串中读取多个数据:
 
 

int i, j;
char s[50];
sscanf("12 56", "%d %s", &i, s, &j);


 
需要注意的是, sscanf 函数在字符串中读取数据时不会进行边界检查,可能会导致缓冲区溢出或其他问题。因此,在使用 sprintf 函数时,应确保字符串中的数据格式与 format 字符串中的格式说明符相匹配,并确保缓冲区的大小足够容纳读取的数据。

sprintf和sscanf的模拟实现太复杂就不模拟了。


文章已到末尾,希望多多支持。

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

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

相关文章

【Linux】信号-下

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;信号递达&#xff0c;信号未决&#x…

vue3学习——自定义插件,注册组件(引入vue文件报红线)

在src/components文件夹目录下创建一个index.ts文件 import { App, Component } from Vue import SvgIcon from /components/SvgIcon/index.vue import Pagination from /components/Pagination/index.vue const globalComponents: { [name: string]: Component } { SvgIcon,…

第三模块 面向对象网络并发编程

第三模块 面向对象&网络&并发编程 面向对象基础1. 初识面向对象1.1 对象和self1.2 常见成员1.3 应用示例 2. 三大特性2.1 封装2.2 继承练习题2.3 多态 3. 扩展&#xff1a;再看数据类型总结作业 从今天开始&#xff0c;我们将进入系列课程第3个模块的的学习&#xff0c…

TCP和UDP相关问题(重点)(5)——5.TCP三次握手和四次挥手(非常重要)

5.1三次握手的过程 一次握手&#xff1a;客户端发送带有SYN(x)标志的数据包到服务端&#xff0c;然后客户端进入SYN_SEND状态&#xff0c;等待服务器端的确认。 二次握手&#xff1a;服务端发送带有SYN(y)ACK(x1)标志的数据包到客户端&#xff0c;然后服务端进入SYN_RECV状态。…

Java设计模式大全:23种常见的设计模式详解(三)

本系列文章简介&#xff1a; 设计模式是在软件开发过程中&#xff0c;经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合&#xff0c;可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在…

收到微信发的年终奖。。。

大家好&#xff0c;我是小悟 还剩一天就过除夕了&#xff0c;很多单位都已经放假了&#xff0c;街上的人越来越少&#xff0c;门店关着的很多&#xff0c;说明大家都陆陆续续回自己的家乡过年了。 或许你还在搬砖&#xff0c;坚守节前最后一波工作&#xff0c;或许你正在回家的…

Java学习16-- 面向对象学习45. 面向对象三大特征抽象类和接口

面向对象学习4. 面向对象三大特征 1封装&#xff1a;高内聚(内部细节自己用&#xff0c;外部不能介入)&#xff0c;低耦合(保留很少接口给外部使用)&#xff0c;信息隐藏&#xff08;禁止外界直接访问内部数据(private)&#xff0c;如需要&#xff0c;可通过get/set接口访问&a…

【评论送书】AIGC重塑教育:AI大模型驱动的教育变革与实践

作者&#xff1a;刘文勇 来源&#xff1a;IT阅读排行榜 本文摘编自《AIGC重塑教育&#xff1a;AI大模型驱动的教育变革与实践》&#xff0c;机械工业出版社出版 这次&#xff0c;狼真的来了。 AI正迅猛地改变着我们的生活。根据高盛发布的一份报告&#xff0c;AI有可能取代…

第九个知识点:内部对象

Date对象: <script>var date new Date();date.getFullYear();//年date.getMonth();//月date.getDate();//日date.getDay();//星期几date.getHours();//时date.getMinutes();//分date.getSeconds();//秒date.getTime();//获取时间戳&#xff0c;时间戳时全球统一&#x…

Qt 常用算法及正则表达式

目录 常用算法 正则表达式 常用算法 double c qAbs(a)&#xff0c;函数 qAbs() 返回 double 型数值 a 的绝对值 double max qMax(b,c)&#xff0c;函数 qMax() 返回两个数值中的最大值 int bnqRound(b)&#xff0c;返回一个与浮点数最接近的整数值(四舍五入) int cn q…

玩转量子代码:量子软件入门指南

量子计算领域关注的焦点往往落在硬件上&#xff1a;量子比特和超导电路等。但现在是时候把我们的注意力转移到幕后英雄量子软件上&#xff0c;从将抽象的量子算法转化为可执行的代码到优化电路设计&#xff0c;量子软件起到了举足轻重的作用。 我们在本文中将探究量子编程的基…

多维时序 | Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预测

多维时序 | Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预测 目录 多维时序 | Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预…

一文带你搞定搭建自己的组件库Rollup

一文带你搞定搭建自己的组件库(rollup.js) 目前Vue和React都是采用rollup.js进行打包,我们在公司开发的时候也可以用rollup搭建一个自己的组件库放到你的项目中,简化项目的结构项目性能。 接下来我将带你使用rollup从0——1搭建一个在vue中使用的组件库 开发前准备 我的开发…

java Servlet 云平台教学系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc

一、源码特点 JSP 云平台教学系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助 系统采用serlvet dao bean&#xff0c;系统具有完整的源代码和数据库 &#xff0c;系统主要采用B/S模式开发。开发 环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据…

Github进不去的解决方法

方案一: 很多人想进入GIthub却总是出现下面的情况,一直转圈圈 这是因为中国大陆是没有Github的服务器的,需要跳到国外的服务器,这个时候需要加速器,或者是选择路劲最佳的路由,这里我介绍一款软件Watt Toolkit 在你们的微软商城里面就可以找到,这个是免费的推荐使用一下 一键加速…

Java图形化界面编程——Container容器 笔记

2.3 Container容器 2.3.1 Container继承体系 Winow是可以独立存在的顶级窗口,默认使用BorderLayout管理其内部组件布局;Panel可以容纳其他组件&#xff0c;但不能独立存在&#xff0c;它必须内嵌其他容器中使用&#xff0c;默认使用FlowLayout管理其内部组件布局&#xff1b;S…

C++ 语法文件

程序运行时产生的数据都属于临时数据&#xff0c;程序结束就会被释放。 通过文件可以可以将数据持久化 c中对文件操作需要包含头文件fstream 文件的类型分为两种 1.文本文件 文件以文本的ASCII码形式存储在计算机中 2.二进制文件 稳重以文本的二进制形式存储在计算机中 用…

用通俗易懂的方式讲解:一文搞懂大模型 Prompt Engineering(提示工程)

本文将从提示工程的本质、提示工程的原理、提示工程的应用三个方面&#xff0c;带您一文搞懂提示工程 Prompt Engineering 。 文末精选通俗易懂的方式讲解系列&#xff0c;如果你喜欢技术交流&#xff0c;文末可以加入 文章目录 提示工程的本质提示工程的原理提示工程的应用技…

CSS:九宫格布局

九宫格布局效果如下&#xff1a; HTML 结构&#xff1a; <div class"container"><div class"item">1</div><div class"item">2</div><div class"item">3</div><div class"item&q…

bert+np.memap+faiss文本相似度匹配 topN

目录 任务 代码 结果说明 任务 使用 bert-base-chinese 预训练模型将文本数据向量化后&#xff0c;使用 np.memap 进行保存&#xff0c;再使用 faiss 进行相似度匹配出每个文本与它最相似的 topN 此篇文章使用了地址数据&#xff0c;目的是为了跑通这个流程&#xff0c;数…