解析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.hqwc.cn/news/459034.html

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

相关文章

hr最讨厌这6种应届生简历❌

用求职方法&#xff0c;让你变成offer收割机&#xff0c;是我的责任❗ 简历写得好&#xff0c;面试少不了。最近很多应届生找龙猫帮看简历&#xff0c;我发现很多应届生是真不会写简历啊。 有的简历排版花里胡哨&#xff0c;有的自我评价千篇一律&#xff0c;有的实习经历太过…

SpringBoot:web开发

web开发demo&#xff1a;点击查看 LearnSpringBoot05Web 点击查看更多的SpringBoot教程 技术摘要 webjarsBootstrap模板引擎thymeleaf嵌入式Servlet容器注册web三大组件 一、webjars webjars官网 简介 简介翻译 WebJars 是打包到 JAR&#xff08;Java Archive&#xff09;…

【网站项目】032汽车客运站管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

第十个知识点:继承

在ES6之后&#xff0c;javascript引入了类的概念&#xff0c;也就是说与java相同&#xff0c;我们可以在js文件中创建类与对象&#xff0c;然后通过extend继承 <script>class Father {constructor(name) {//父类构造器this.name name;}speak(){//父类方法console.log(我…

H2和流行关系型数据库对比

1.H2和SQLite数据库对比 1.1.独特的特点和用途 H2 和 SQLite 是两个流行的轻量级数据库&#xff0c;它们各自有一些独特的特点和用途&#xff1a; H2 数据库: 主要用于 Java 应用&#xff0c;因为它是用 Java 编写的。支持内存模式和磁盘持久化。提供了一个基于浏览器的控制台…

2024年【陕西省安全员C证】考试及陕西省安全员C证免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 陕西省安全员C证考试考前必练&#xff01;安全生产模拟考试一点通每个月更新陕西省安全员C证免费试题题目及答案&#xff01;多做几遍&#xff0c;其实通过陕西省安全员C证实操考试视频很简单。 1、【多选题】下列关于…

Linux大集合

Linux Linux是什么&#xff1f; Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、 支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和 64位硬件。 Linux内核 是一个Linux系统…

分享76个行业PPT,总有一款适合您

分享76个行业PPT&#xff0c;总有一款适合您 76个行业PPT下载链接&#xff1a;https://pan.baidu.com/s/17zUV16XOg9uBfDTH7sURxw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知…

linux之wsl2安装远程桌面

0. 安装后的效果 1. wsl中打开terminal并安装库 sudo apt-get purge xrdp sudo apt install -y xrdp sudo apt install -y xfce4 sudo apt install -y xfce4-goodies 2.优化显示 sudo sed -i s/max_bpp32/#max_bpp32\nmax_bpp128/g /etc/xrdp/xrdp.ini sudo sed -i s/xserverbp…

基于SpringBoot+Vue的校园博客管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

vue3(笔记)

组合式Api setup-----相当于beforeCreate, create生命周期 reactive–定义状态 对象形式 响应式原理 toRefs— Pinia &#xff08;只有state、getters和actions&#xff09; 更加简洁的语法&#xff0c;完美支持Vue3的Composition api 和 对TypesCcript的完美支持

后端创建订单

package com.java1234.entity;import io.jsonwebtoken.Claims;/*** jwt验证信息* author java1234_小锋* site www.java1234.com* company Java知识分享网* create 2019-08-13 上午 10:00*/ public class CheckResult {private int errCode;private boolean success;private Cl…