【C语言 | 字符串处理】sscanf 详细介绍、使用说明以及使用例子源码

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰:2024-05-08 15:40:38

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、sscanf 函数介绍
  • 🎄三、sscanf 函数使用例子
    • ✨3.1 sscanf 函数解析字符串
    • ✨3.2 sscanf 函数解析数字
  • 🎄四、总结


在这里插入图片描述

在这里插入图片描述

🎄一、概述

在Linux的man手册是这样介绍 sscanf 系列函数的:

scanf()函数族根据如下所述的格式扫描输入。此格式可能包含转换规范;这种转换的结果(如果有的话)存储在遵循格式的指针参数所指向的位置。每个指针参数的类型必须适合相应转换规范返回的值。
如果格式中转换规范的数量超过指针参数的数量,则结果是未定义的。如果指针参数的数量超过转换规范的数量,则会计算多余的指针参数,但在其他情况下会被忽略。

在C语言日常编程中,常常会使用sscanf来解析字符串,将字符串中特定的数字、字符串解析到指定的内存(变量)中。


在这里插入图片描述

🎄二、sscanf 函数介绍

sscanf 函数原型:

#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
  • 函数介绍:sscanf 函数定义在 <stdio.h> 头文件中,它的功能是从str参数指定的字符串,按照format参数指定的格式获取数据;与其功能类似的还有scanf、fscanf,scanf是从标准输入按照格式获取数据,fscanf是从指定的文件按照格式获取数据。
  • 函数参数:
    • str:指定要获取数据的源字符串,也就是要解析的字符串;
    • format:格式字符串。指定了要匹配的格式规则。格式字符串由一系列指令组成,这些指令描述了如何处理输入字符序列。如果指令处理失败,则不再读取进一步的输入,sscanf()将返回。“失败”可以是以下任意一种:输入失败,意味着输入字符不可用,或者匹配失败,意味着您的输入不合适。
    • ...:可变参数列表,用于接收解析后的数据。
  • 返回值:sscanf 函数返回成功解析的数据项的个数。如果解析失败或没有匹配的数据项,则返回0。

format 参数常用的指令是:以“%”(百分比)字符开头。根据此规范转换输入中的字符序列,并将结果放入相应的指针参数中。如果下一个输入项与转换规范不匹配,则转换失败——这是匹配失败。

常用的格式字符串如下:

  • %%:匹配百分号字符“%”。也就是说,格式字符串中的%%与单个输入“%”字符匹配。不会进行任何转换(但会丢弃初始空白字符),也不会进行赋值。
  • %d:匹配一个可选的带符号的十进制整数;下一个指针必须是指向int的指针。
  • %u:匹配一个无符号十进制整数;下一个指针必须是指向无符号int的指针。
  • %f:匹配一个可选的带符号浮点数;下一个指针必须是要浮动的指针。
  • %x:匹配一个无符号的十六进制整数;下一个指针必须是指向无符号int的指针。
  • %c:匹配长度由最大字段宽度(默认值为1)指定的字符序列;下一个指针必须是指向char的指针,并且必须有足够的空间容纳所有字符(不添加终止的空字节)。通常跳过前导空白被抑制。要先跳过空白,请在格式中使用显式空格。
  • %s:匹配非空白字符序列;下一个指针必须是指向字符数组的初始元素的指针,该元素的长度足以容纳输入序列和自动添加的终止空字节(“\0”)。输入字符串停止在空白处或最大字段宽度处,以先出现的为准。

在这里插入图片描述

🎄三、sscanf 函数使用例子

使用 sscanf 函数的用法主要有两种:一是从输入字符串中解析出想要的字符串;二是从输入字符串中解析出想要的数字。

✨3.1 sscanf 函数解析字符串

解析简单字符串:下面例子可以将输入字符串存到str中:

char str[64] = {0, };
sscanf("hello , world", "%s", str);

解析稍微复杂的字符串,将输入字符串从逗号分开成两个字符串存在str1,str2:

char str1[64] = {0, };
char str2[64] = {0, };
int  num = 0;
sscanf("hello , world ! 123", "%s , %s ! %d", str1, str2, &num);

解析更复杂的字符串,获取输入字符串中两个百分号(%)之间的字符串:

char str_mid[64] = {0,};
sscanf("%hello,world! %123", "%%%s%%123", str_mid);

注意sscanf 函数解析字符串时在格式字符串会使用%s,而%s会将输入字符串一直匹配,直到出现空白字符或已经达到字符串最大匹配长度。


✨3.2 sscanf 函数解析数字

解析整数

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

解析浮点数

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

解析复杂字符串的数字,下面是从输入字符串,解析出IP地址和Mac地址的值:

unsigned char ucIp[4] = {0,};
sscanf("192.168.1.100", "%u.%u.%u.%u", (unsigned int*)(ucIp+0),(unsigned int*)(ucIp+1), (unsigned int*)(ucIp+2), (unsigned int*)(ucIp+3));unsigned char mac[6] = {0,};
sscanf("ec:d6:8a:29:8d:0a", "%02x:%02x:%02x:%02x:%02x:%02x",(unsigned int*)(mac+0),(unsigned int*)(mac+1),(unsigned int*)(mac+2),(unsigned int*)(mac+3),(unsigned int*)(mac+4),(unsigned int*)(mac+5));

上述例子完整C语言代码:

// sscanf.c
// gcc sscanf.c 
#include <stdio.h>int main()
{char str[64] = {0, };sscanf("hello , world", "%s", str);printf("str=[%s]\n", str);char str1[64] = {0, };char str2[64] = {0, };int  num = 0;sscanf("hello , world ! 123", "%s , %s ! %d", str1, str2, &num);printf("str1=[%s], str2=[%s] num=%d\n", str1, str2, num);char str_mid[64] = {0,};sscanf("%hello,world! %123", "%%%s%%123", str_mid);printf("str_mid=[%s]\n", str_mid);int i;sscanf("123", "%d\n", &i);printf("i=%d", i);float f;sscanf("1.23", "%f\n", &f);printf("f=%f\n", f);unsigned char ucIp[4] = {0,};sscanf("192.168.1.100", "%u.%u.%u.%u", (unsigned int*)(ucIp+0),(unsigned int*)(ucIp+1), (unsigned int*)(ucIp+2), (unsigned int*)(ucIp+3));printf("%u.%u.%u.%u\n", ucIp[0], ucIp[1], ucIp[2], ucIp[3]);unsigned char mac[6] = {0,};sscanf("ec:d6:8a:29:8d:0a", "%02x:%02x:%02x:%02x:%02x:%02x",(unsigned int*)(mac+0),(unsigned int*)(mac+1),(unsigned int*)(mac+2),(unsigned int*)(mac+3),(unsigned int*)(mac+4),(unsigned int*)(mac+5));int j = 0;for(j=0; j<6; j++){printf("%02x:", mac[j]);}printf("\n");return 0;
}

在这里插入图片描述

🎄四、总结

👉本文详细介绍了C语言解析字符串常用的sscanf函数,并给出了使用该函数解析字符串的例子。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

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

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

相关文章

虚拟机CentOS密码重置

1&#xff0c;reboot重启 在出现下面的界面1按e 如果有选项就选择“CentOS Linux &#xff08;3.10.0-327.e17.x86_64&#xff09;7 &#xff08;Core&#xff09;”【我的电脑没有直接显示界面2】 界面1 界面2 2&#xff0c;在上述界面2中继续按e进入编辑模式 找到“ro cr…

Ubuntu20.4部署Cuda12.4

准备Ubuntu20.4 VM 安装Cuda12.4 1.进入如下界面安装安装Cuda12.4版本&#xff1a; CUDA Toolkit 12.4 Update 1 Downloads | NVIDIA Developerhttps://developer.nvidia.com/cuda-downloads?target_osLinux&target_archx86_64&DistributionUbuntu&target_vers…

【谷粒商城】03创建商品模块

1.创建模块 2.创建项目微服务 商品服务、仓储服务、订单服务、优惠券服务、用户服务 共同&#xff1a; 1&#xff09;、web、openfeign 2&#xff09;、每一个服务&#xff0c;包名 com.atguigu.gulimall.xxx(product/order/ware/coupon/member) 3&#xff09;、模块名&#x…

关于 IIS 开启匿名访问网站仍要账号密码登录网站的解决方法

欢迎关注公总号【云边小网安】 问题提出&#xff1a;发现虽然勾选了允许匿名访问网站&#xff0c;但在访问某一网站的时候仍然需要登录账号密码 解决方法一&#xff1a;登录管理员账号密码解决方法二&#xff1a;添加访问网站文件夹的用户 访问某一网站本质上来讲&#xff0…

【NVIDIA Jetpack6.0】Jetson AGX Orin内核、设备树更新指南

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

【Linux-IMX6ULL-DDR3简介测试-RGBLCD控制原理】

目录 1. DDR3 简介1.1 前要基本概念RAM & ROM 2. DDR3测试及初始化3. RGBLCD简介及控制原理3.1 RGBLCD简介3.2.1 RGB LCD时序3.2.2 像素时钟&#xff08;800*400分辨率&#xff09;3.2.2 显存&#xff08;800*400分辨率&#xff09; 3.3 RGBLCD的控制3.3.1 DOTCLK 硬件接口…

关于Hash表,你不得不知道的知识点

定义&#xff1a; 哈希表是根据关键码值(Key value)而直接进行访问的数据结构。也就是说&#xff0c;它通过把关键码值映射到表中一个位置来访问记录&#xff0c;以加快查找的速度。这个映射函数叫做散列函数&#xff0c;也称为hash函数&#xff0c;存放记录的数组叫做散列表。…

按键的短按、长按和连续的划分

在实际生活中&#xff0c;我们使用到的按键在短按、长按和按键松开时都会触发不同的功能。按键短按后松开和长按后松开的应用比短按和长按的应用较少&#xff0c;我了解的按键短按后松开和长按后松开的应用是在点动控制和长动控制中。这里主要讨论按键的短按、长按和连续这三种…

类型注解-Python

师从黑马程序员 类型注解的语法 类型注释的限制 import json import randomvar_1 : int10 var_2 : str"itheima" var_3 : boolTrueclass Student:pass stu :StudentStudent()my_list:list [1,2,3] my_tuple:tuple(1,2,3) my_dict:dict{"itheima":666}my_l…

1060: 无向图的最大度计算

解法&#xff1a; #include<iostream> #include<vector> using namespace std; int arr[100][100]; int main() {int n, max 0;cin >> n;vector<int> sum(n, 0);for (int i 0; i < n; i) {for (int j 0; j < n; j) {cin >> arr[i][j];…

SSRF服务器端请求伪造

漏洞原理 SSRF挖掘 SSRF具体利用 SSRF具体验证 SSRF防御与绕过 漏洞原理 这个漏洞允许攻击者去利用服务端的功能&#xff0c;来请求其他网络资源 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是指攻击者能够从易受攻击的 Web应用程序发送精心设计的请求的对其他网站…

【三十一】springboot+easyExcel实现多文件导出压缩包

互相交流入口地址 整体目录&#xff1a; 【一】springboot整合swagger 【二】springboot整合自定义swagger 【三】springboot整合token 【四】springboot整合mybatis-plus 【五】springboot整合mybatis-plus 【六】springboot整合redis 【七】springboot整合AOP实现日志操作 【…