C语言奇技Y巧之sscanf函数用法详解

2024-02-21 01:20

本文主要是介绍C语言奇技Y巧之sscanf函数用法详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • sscanf函数介绍
  • 一般用法:读取字符串、整型、浮点数
  • sscanf 使用正则表达式
  • sscanf 返回-1
  • sscanf 解析失败处理
  • sscanf 缺点

sscanf函数介绍

sscanf,C语言中的函数,读取格式化的字符串中的数据。

#include <stdio.h>
int sscanf(const char *str, const char *format, ...);

str:待解析的字符串;
format:字符串格式描述;
…:其后是一序列数目不定的指针参数,存储解析后的数据;
返回值:成功则返回解析参数数目,失败则返回-1,错误原因存于errno中。

一般用法:读取字符串、整型、浮点数

1、读取字符串,遇到空格停止,可指定最大读取字符个数,防止溢出。

    char buf[128] = {0};sscanf("1234#$%^&*/56ab  7c", "%20s", buf);printf("%s\n", buf);//sscanf 默认遇到空格停止,若要读取空格可以使用%[ ]

打印

1234#$%^&*/56ab

2.读取整型,固定长度格式读取每一段数据

    int year, month, day;int converted = sscanf("20191103", "%4d%2d%2d", &year, &month, &day);printf("converted=%d, year=%d, month=%d, day=%d\n", converted, year, month, day);

打印

converted=3, year=2019, month=11, day=3

3.读取浮点数,可以格式化保存小数点位数

    double lon, lat;int converted2 = sscanf("118.123456789 32.123456789", "%lf %lf", &lon, &lat);printf("converted2=%d, lon=%.9lf, lat=%lf\n", converted2, lon, lat);//%.9lf指定保存小数点9位,%lf默认保存6位,第七位四舍五入

打印

converted2=2, lon=118.123456789, lat=32.123457

sscanf 使用正则表达式

sscanf对正则表达式的支持不是特别强大,但大部分基本正则功能可以实现。

1.%[a-z] 读取在 a-z 之间的字符串,如果不在此之间则停止。

    char str[128] = "";//读取0-9和a-z和#字符,遇到不是这些字符时停止,E不属于所以停止读取sscanf("123#abc456#dEF789gh", "%31[0-9a-z#]", str);printf("str=%s\n", str);

打印

str=123#abc456#d

2.%[^a-z] 读取不在 a-z 之间的字符串,如果碰到a-z之间的字符则停止

    char str2[128] = "";//读取非a-z#字符,遇到a-z#字符时停止,这里遇到#停止读取sscanf("123#abc456#dEF789gh", "%31[^a-z#]", str2);printf("str2=%s\n", str2);

打印

str2=123

3.%*[^1-9] 前面带 * 号表示不保存变量,跳过符合条件的字符串。

    char str3[128] = "";//%*[^a-z#]读取非a-z#字符,遇到a-z#字符时停止,且不保存;%s继续读取后面所以字符sscanf("123#abc456#dEF789gh", "%*[^a-z#]%s", str3);printf("str3=%s\n", str3);

打印

str3=#abc456#dEF789gh

4.复合用法,同时读取多个字符串和整数

    std::string msg = "msg:123,ab c,456,D\"ef222";//分别读取字符串和整数,字符串包含空格和"符号char msg1[16];char msg2[16];int int1;int int2;//success=4,成功读取4个字段//%*[^:]前面的msg:不要,读取非:字符,遇到:停止,且不保存//%[a-z ]读取a-z的字符和空格,遇到其他字符则停止//%[a-zA-Z\"]读取a-z和A-Z和"字符,遇到其他字符则停止int success = sscanf(msg.c_str(),"%*[^:]:%d,%[a-z ],%d,%[a-zA-Z\"]",&int1, msg1, &int2, msg2);printf("success=%d\n",success);printf("msg1=%s\n", msg1);printf("msg2=%s\n", msg2);printf("int1=%d\n",int1);printf("int2=%d\n",int2);

打印

success=4
msg1=ab c
msg2=D"ef
int1=123
int2=456

获取 / 和 @ 之间的字符串

    char buf2[128] = {0};//%*[^/]读取非/字符,遇到/停止,这里读取了iios,且不保存//%[^@]读取非@字符,遇到@停止sscanf("iios/12DDWDFFabc@122", "%*[^/]/%[^@]", buf2);printf("buf2=%s\n", buf2);

打印

buf2=12DDWDFFabc

sscanf 返回-1

当sscanf第一个参数为空字符串,或第二个参数为空指针,sscanf 返回-1。
如果sscanf第一个参数为空指针,程序会崩溃。

    int b1;int ret_b = sscanf("123",NULL,&b1);printf("ret_b=%d,b1=%d,err=%d(%s)\n",ret_b, b1, errno, strerror(errno));int b2;ret_b = sscanf("","%d",&b2);printf("ret_b=%d,b2=%d,err=%d(%s)\n",ret_b, b2, errno, strerror(errno));

打印

ret_b=-1,b1=32766,err=22(无效的参数)
ret_b=-1,b2=436341776,err=0(成功)

sscanf 解析失败处理

如果sscanf参数语法格式没问题,不会返回-1,返回解析成功的字段个数,一个都没成功返回0。

当遇到解析失败, sscanf 会停止后面的解析,本例只解析成功了a1,解析a2时失败并停止读取,返回1,打印的a2和a3是未初始化的乱码。

    int a1;int a2;int a3;int ret_a = sscanf("123,a,456", "%d,%d,%d", &a1, &a2, &a3);printf("ret_a=%d,a1=%d,a2=%d,a3=%d\n",ret_a,a1,a2,a3);

打印

ret_a=1,a1=123,a2=1528212112,a3=32766

sscanf 缺点

1.不同操作系统对 sscanf 的支持不同,移植时可能出现bug。
2.复杂字符串处理容易出错,可读性差,不易调试。

这篇关于C语言奇技Y巧之sscanf函数用法详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/730165

相关文章

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE