sscanf 函数详解
1. sscanf
是什么?
sscanf
是 C 标准库中的一个函数,定义在头文件 <stdio.h>
中。
它的作用是从一个字符串中按照指定格式读取数据,将解析出的数据赋值给对应的变量。
换句话说,sscanf
是 scanf
的变体,区别是数据来源是字符串而不是标准输入。
2. 函数原型
int sscanf(const char *str, const char *format, ...);php53 Bytes© 菜鸟-创作你的创作
str
:指向要解析的字符串。format
:格式字符串,规定如何解析字符串。...
:后面是指向变量的指针,用于存储解析后的数据。
3. 返回值
- 返回成功匹配和赋值的参数个数(不包括
str
和format
)。 - 如果没有成功匹配,返回 0。
- 如果发生读取错误,返回
EOF
(通常是 -1)。
4. 常见格式控制符
格式符 | 说明 | 示例 |
| 读取十进制整数 |
|
| 读取浮点数 |
|
| 读取单个字符 |
|
| 读取字符串(遇空格结束) |
|
| 读取十六进制整数 |
|
| 读取八进制整数 |
|
| 读取无符号整数 |
|
5. 使用示例
示例 1:解析整数和浮点数
#include <stdio.h>int main() { char str[] = "100 3.14"; int i; float f; int ret = sscanf(str, "%d %f", &i, &f); printf("ret=%d, i=%d, f=%f\n", ret, i, f); return 0;}php193 Bytes© 菜鸟-创作你的创作
输出:
ret=2, i=100, f=3.140000php24 Bytes© 菜鸟-创作你的创作
说明:成功读取了 2 个数据。
示例 2:读取字符串和字符
#include <stdio.h>int main() { char str[] = "A HelloWorld"; char c; char s[20]; sscanf(str, "%c %s", &c, s); printf("c=%c, s=%s\n", c, s); return 0;}php177 Bytes© 菜鸟-创作你的创作
输出:
c=A, s=HelloWorldphp17 Bytes© 菜鸟-创作你的创作
示例 3:复杂格式解析
#include <stdio.h>int main() { char str[] = "Name: John Age: 30 Height: 5.9"; char name[20]; int age; float height; sscanf(str, "Name: %s Age: %d Height: %f", name, &age, &height); printf("Name=%s, Age=%d, Height=%.1f\n", name, age, height); return 0;}php285 Bytes© 菜鸟-创作你的创作
输出:
Name=John, Age=30, Height=5.9php29 Bytes© 菜鸟-创作你的创作
6. 注意事项
- 缓冲区大小
使用%s
时,应确保字符串缓冲区足够大,否则可能导致缓冲区溢出。可以指定最大读取长度,例如%19s
。 - 格式匹配严格
格式字符串必须严格匹配输入字符串结构,否则会解析失败。 - 空白字符匹配
格式字符串中的空白字符(空格、制表符等)可以匹配任意数量的空白字符,包括零个。 %c
读取单字符,不跳过空白%c
会读取包括空白符在内的字符,和%s
、%d
不同,它不会跳过空白。- 返回值检查
使用sscanf
后,应该检查返回值以确认成功读取了多少个参数。
7. 小结
sscanf
用于从字符串解析数据,功能类似scanf
。- 解析格式通过格式字符串定义,支持各种数据类型。
- 返回成功匹配的参数个数,便于检测解析是否成功。
- 适合从格式化字符串中提取信息,如配置解析、数据处理等。
如果你想要,我还可以帮你写更多带边界检查和错误处理的 sscanf
使用示例,或者帮你理解它和 scanf
、fscanf
、strtok
等函数的区别。
https://www.52runoob.com/archives/5187