字符串函数 sscanf() 详解

什么是 sscanf() 函数?

sscanf() 函数是 C 语言中的一个标准库函数,它的作用是从一个字符串中按照指定的格式提取数据,并将其存储到对应的变量中。它的原型如下:

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

其中,str 是要解析的字符串,format 是格式控制字符串,后面是一系列的指针参数,用来接收解析后的数据。sscanf() 函数返回成功匹配和赋值的个数,如果发生错误或到达字符串末尾,则返回 EOF。

sscanf() 函数的格式控制字符串

sscanf() 函数的格式控制字符串是由一些格式说明符组成的,每个格式说明符都以 % 开始,用来指定要提取的数据的类型和方式。格式说明符的一般形式是:

%[*][width][modifiers]type

其中,各个部分的含义如下:

  • * 是一个可选的星号,表示忽略该数据,不存储到对应的参数中。
  • width 是一个可选的整数,表示要读取的最大字符数。
  • modifiers 是一些可选的修饰符,用来指定数据的大小或精度,常见的有:
    • h 表示短整型(对于 di 和 n),或无符号短整型(对于 ou 和 x)。
    • l 表示长整型(对于 di 和 n),或无符号长整型(对于 ou 和 x),或双精度浮点型(对于 ef 和 g)。
    • L 表示长双精度浮点型(对于 ef 和 g)。
  • type 是一个必需的字符,表示要提取的数据的类型,常见的有:
    • c 表示单个字符,如果指定了 width,则会读取 width 个字符,并存储到一个字符数组中。
    • d 表示十进制整数,数字前面的 + 或 - 号是可选的。
    • eEfgG 表示浮点数,包含了一个小数点,一个可选的前置符号 + 或 -,一个可选的后置字符 e 或 E,以及一个十进制指数。
    • o 表示八进制整数。
    • s 表示字符串,会读取连续的非空白字符,直到遇到一个空白字符为止。
    • u 表示无符号的十进制整数。
    • xX 表示十六进制整数。
    • [ 表示字符集合,会读取符合指定字符集合的连续字符,直到遇到一个不符合的字符为止。字符集合可以用 - 表示范围,例如 [0-9] 表示数字,也可以用 ^ 表示取反,例如 [^a-z] 表示非小写字母。如果字符集合以 ^ 开始,则 ^ 不表示取反,而是表示本身,例如 [^^] 表示非 ^ 的字符。

sscanf() 函数的使用示例

下面给出一些使用 sscanf() 函数的示例,以及相应的输出结果。

#include <stdio.h>

int main()
{
    char str[100] = "2021-03-01 10:44:00"; // 要解析的字符串
    int year, month, day, hour, minute, second; // 存储解析后的数据的变量
    int n; // 存储 sscanf() 函数的返回值

    // 从字符串中按照指定的格式提取数据
    n = sscanf(str, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second);

    // 输出提取的数据和返回值
    printf("year = %d\n", year);
    printf("month = %d\n", month);
    printf("day = %d\n", day);
    printf("hour = %d\n", hour);
    printf("minute = %d\n", minute);
    printf("second = %d\n", second);
    printf("n = %d\n", n);

    return 0;
}

输出结果为:

year = 2021
month = 3
day = 1
hour = 10
minute = 44
second = 0
n = 6

从输出结果可以看出,sscanf() 函数成功地从字符串中提取了年月日时分秒的数据,并存储到对应的变量中,返回值为 6,表示有 6 个数据被匹配和赋值。

下面再看一个使用字符集合的示例:

#include <stdio.h>

int main()
{
    char str[100] = "Hello, world!"; // 要解析的字符串
    char word1[20], word2[20]; // 存储解析后的数据的变量
    int n; // 存储 sscanf() 函数的返回值

    // 从字符串中按照指定的格式提取数据
    n = sscanf(str, "%[^,], %s", word1, word2);

    // 输出提取的数据和返回值
    printf("word1 = %s\n", word1);
    printf("word2 = %s\n", word2);
    printf("n = %d\n", n);

    return 0;
}

输出结果为:

word1 = Hello
word2 = world!
n = 2

从输出结果可以看出,sscanf() 函数使用了字符集合 [^,] 来提取第一个逗号之前的字符串,然后使用了 s 来提取第一个空格之后的字符串,返回值为 2,表示有 2 个数据被匹配和赋值。

sscanf() 函数的注意事项

在使用 sscanf() 函数时,需要注意以下几点:

  • sscanf() 函数会从字符串的开头开始解析,如果遇到不符合格式的字符,就会停止解析,并返回已经匹配和赋值的个数。因此,要保证字符串的格式和格式控制字符串的格式一致,否则可能会导致解析失败或不完全。
  • sscanf() 函数的格式控制字符串中可以包含空格字符、制表符、换行符等,它们会被忽略,不影响解析。但是,如果要匹配字符串中的空白字符,就不能使用 s 类型,而要使用 c 类型或字符集合类型,并指定 width 为 1。
  • sscanf() 函数的后面的指针参数必须和格式说明符的类型一致,否则可能会导致数据错误或内存溢出。例如,如果要提取一个整数,就不能使用 char * 类型的参数,而要使用 int * 类型的参数,并在变量名前加上 & 符号,表示取地址。
  • sscanf() 函数不会在提取的字符串后面自动添加空字符,因此,如果要将提取的字符串作为一个完整的字符串使用,就需要手动在后面添加空字符,或者在定义字符数组时多预留一个空间,用来存储空字符。
  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值