sscanf 是 C 语言标准库中的一个函数,用于从字符串中解析和提取数据。它的全称是 "string scan formatted"。sscanf 通过指定的格式说明符从输入字符串中读取数据,并将这些数据存储到相应的变量中。它的工作方式类似于 scanf,但 sscanf 是从一个字符串中读取,而不是从标准输入(如键盘)读取。
int sscanf(const char *str, const char *format, ...);
参数说明
str: 要解析的输入字符串。这是一个以 '\0' 结尾的 C 字符串。
format: 格式控制字符串,包含格式说明符,用来指定如何解析字符串并提取数据。
...: 可变数量的参数,这些是指向变量的指针,用来接收解析后的数据。
返回值
sscanf 返回成功解析并存储的项目数量。如果未能成功匹配任何项,返回值为 0。如果在遇到格式错误或到达字符串末尾之前成功解析了部分数据,返回已成功解析的项数。
常见的格式说明符
- %d: 读取一个十进制整数。
- %f: 读取一个浮点数。
- %s: 读取一个字符串,遇到空白字符(如空格、制表符)停止。
- %c: 读取一个字符。
- %x: 读取一个十六进制整数。
- %hhu: 读取一个无符号的 8 位整数(unsigned char)。
- %[^...]: 读取并匹配字符集之外的字符,直到遇到指定的终止符。
sscanf 和正则表达式的比较
他们都是用来解析字符串的工具,但它们有不同的功能、使用场景和灵活性。以下是两者的比较和一些具体的例子:
示例:
假设有一个字符串 "Bus 001 Device 013: ID 0451:8142",你可以使用 sscanf 解析总线号和设备号:
char bus[10], device[10];
sscanf(line, "Bus %s Device %s", bus, device);
printf("Bus: %s, Device: %s\n", bus, device);
假设有一个相同的字符串 "Bus 001 Device 013: ID 0451:8142",你可以用正则表达式提取总线号和设备号:
#include <regex.h>
char line[] = "Bus 001 Device 013: ID 0451:8142";
regex_t regex;
regmatch_t matches[3]; // [0] for full match, [1] for bus, [2] for device
// Compile the regex pattern
regcomp(?ex, "Bus ([0-9]+) Device ([0-9]+)", REG_EXTENDED);
// Execute the regex
if (regexec(?ex, line, 3, matches, 0) == 0) {
char bus[10], device[10];
int len = matches[1].rm_eo - matches[1].rm_so;
strncpy(bus, line + matches[1].rm_so, len);
bus[len] = '\0';
len = matches[2].rm_eo - matches[2].rm_so;
strncpy(device, line + matches[2].rm_so, len);
device[len] = '\0';
printf("Bus: %s, Device: %s\n", bus, device);
}
// Free the compiled pattern
regfree(?ex);
选择使用哪种方式?
- 如果你的字符串格式是固定的且简单,sscanf 是一个不错的选择。
- 如果你需要更复杂或灵活的匹配,正则表达式会更适合。
本文暂时没有评论,来添加一个吧(●'◡'●)