sscanf函数使用详解

sscanf函数使用详解一 描述 sscanf 通常被用来解析并转换字符串 其格式定义灵活多变 可以实现很强大的字符串解析功能 sscanf 的原型 include stdio h intsscanf constchar str constchar format str 待解析的字符串 format 字符串格式描述 其后是一序列数目不定的指针参数 存储解析后的数据 二 示例用法 1 sscanf 的基本用法整形数转换 intyear month day stdio h

一、描述

sscanf通常被用来解析并转换字符串,其格式定义灵活多变,可以实现很强大的字符串解析功能。

sscanf的原型

#include 
  
    int sscanf(const char *str, const char *format, ...); 
  

str:待解析的字符串;

format:字符串格式描述;

其后是一序列数目不定的指针参数,存储解析后的数据.

二、示例用法

1. sscanf的基本用法

整形数转换

int year, month, day; int converted = sscanf("", "%04d%02d%02d", &year, &month, &day); printf("converted=%d, year=%d, month=%d, day=%d/n", converted, year, month, day);

输出结果:

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

“%04d%02d%02d”是用来解析字符串的格式,%表示格式转换的开始,d表示转换为一个整数,04作为d的修饰,表示这是一个长度为4位的整数,不足4位时以0补齐。

例子返回结果等于3,表示有3个数据成功转换,转换成功数目同时取决于被解析的字符串以及其转换格式,如果我们把例子中的格式改为”%04d%02d”,那么sscanf将只返回2,day的数值不会被sscanf更改。

浮点数转换

double longitude, latitude; int converted = sscanf("113. 31.", "%lf %lf", &longitude, &latitude); printf("converted=%d, longitude=%.9lf, latitude=%lf/n", converted, longitude, latitude);

输出结果:

converted=2, longitude=113., latitude=31. 

sscanf的格式字符串中,f表示这是一个浮点数,其修饰词l表示这是一个double的浮点数。

2. sscanf的高级用法

数字+字符串

char str[32] = ""; sscanf("abcdedf", "%31[0-9]", str); printf("str=%s/n", str);

输出结果:

str= 

上面的格式中,[0-9]表示这是一个仅包含0-9这几个字符的字符串,前面使用数字31修饰词表示这个字符串缓冲区的最大长度(这也是sscanf最为人诟病的地方,很容易出现缓冲区溢出错误,实际上sscanf是可以避免出现缓冲区溢出的,只要在书写任何字符串解析的格式时,注意加上其缓冲区尺寸的限制)。

char str[32] = ""; sscanf("abcdedf", "%31[0-9a-z]", str); printf("str=%s/n", str);

输出结果:

str=abcdedf 

在格式[]中增加了a-z的描述。

使用^示例:

char str[32] = ""; sscanf("abcdedf", "%31[^a-z]", str); printf("str=%s/n", str);

输出结果:

str= 

在[]中增加表示相反的意思,上面的[a-z]表示一个不包含任何a-z之间的字符串。

使用*的例子:

char str[32] = ""; int ret = sscanf("abcdedf", "%*[0-9]%31[a-z]", str); printf("ret=%d, str=%s/n",ret, str);

输出结果:

ret=1, str=abcdedf 

加上*修饰表示一个被忽略的数据,同时也不需要为它准备空间存放解析结果。如上面的例子中,我们就只使用了str一个参数存放%31[a-z]的解析结果,而sscanf也只返回1,表示只解析了一个数据。

掌握了[], ^, *如何使用后,我们会发现sscanf原来是一个如此强大的工具,很多我们原先认为必须使用正则表达式的地方,很可能使用sscanf就可以实现。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219909.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午9:36
下一篇 2026年3月17日 下午9:36


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号