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. 常见格式控制符

格式符

说明

示例

%d

读取十进制整数

"123" → int 变量

%f

读取浮点数

"3.14" → float/double

%c

读取单个字符

"a" → char

%s

读取字符串(遇空格结束)

"hello" → 字符数组

%x

读取十六进制整数

"0x1A" → int

%o

读取八进制整数

"0755" → int

%u

读取无符号整数

"123" → unsigned int


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 使用示例,或者帮你理解它和 scanffscanfstrtok 等函数的区别。

https://www.52runoob.com/archives/5187