好的!下面是对 C 语言中 sscanf 函数 的详细讲解,包括它的功能、用法、格式控制、示例和注意事项。


sscanf 函数详解


1. sscanf 是什么?

sscanf 是 C 标准库中的一个函数,定义在头文件 <stdio.h> 中。

它的作用是从一个字符串中按照指定格式读取数据,将解析出的数据赋值给对应的变量。

换句话说,sscanf 是 scanf 的变体,区别是数据来源是字符串而不是标准输入。


2. 函数原型

int sscanf(const char *str, const char *format, ...);
  • 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;
}

输出:

ret=2, i=100, f=3.140000

说明:成功读取了 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;
}

输出:

c=A, s=HelloWorld

示例 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;
}

输出:

Name=John, Age=30, Height=5.9

6. 注意事项

  • 缓冲区大小
    使用 %s 时,应确保字符串缓冲区足够大,否则可能导致缓冲区溢出。可以指定最大读取长度,例如 %19s
  • 格式匹配严格
    格式字符串必须严格匹配输入字符串结构,否则会解析失败。
  • 空白字符匹配
    格式字符串中的空白字符(空格、制表符等)可以匹配任意数量的空白字符,包括零个。
  • %c 读取单字符,不跳过空白
    %c 会读取包括空白符在内的字符,和 %s%d 不同,它不会跳过空白。
  • 返回值检查
    使用 sscanf 后,应该检查返回值以确认成功读取了多少个参数。

7. 小结

  • sscanf 用于从字符串解析数据,功能类似 scanf
  • 解析格式通过格式字符串定义,支持各种数据类型。
  • 返回成功匹配的参数个数,便于检测解析是否成功。
  • 适合从格式化字符串中提取信息,如配置解析、数据处理等。

如果你想要,我还可以帮你写更多带边界检查和错误处理的 sscanf 使用示例,或者帮你理解它和 scanffscanfstrtok 等函数的区别。