sscanf期望哪种参数类型用于字符类?

3

我一直在尝试使用字符类使sscanf识别一个相当简单的格式。我注意到,当我提供sscanf与一个char*来匹配字符类时,它会覆盖前一个字节,就好像它期望一个指向2个字节的指针。

我试图实现的一个简化版本:

#include <stdio.h>

int main(void)
{
    char num1;
    char num2;
    int s;
    s = sscanf("1,2", " %[01234567] , %[01234567]", &num1, &num2);
    printf("%d %c %c\n", s, num1, num2);
    return 0;
}

期望输出:2 1 2

实际输出:2 2

但是如果我将char替换为short(或其他大于一个字节的类型),则可以按预期工作,但我会收到关于格式需要类型char*的警告。

实际参数应该是什么类型,还是我犯了其他错误?

1个回答

3

sscanf 需要一个字符串。

char num1[BIG_ENOUGH], num2[BIG_ENOUGH];
s = sscanf("1,2", " %[01234567] , %[01234567]", num1, num2);

当然,这是完全不安全的,因为扫描的字符串加上终止的空字符可能会比缓冲区更长,导致缓冲区溢出。
不幸的是,C类型系统无法区分指向字符数组开头和指向单个字符的指针,所以问题中的代码可以编译通过。

sscanf 实现中难道不是一个 bug 吗?根据文档,对于 %c,"没有空字符附加在末尾。" 然而,我没有找到任何描述类似 %[...] 的参数的文档。 - Vlad
2
我找到了所需的文档:http://linux.die.net/man/3/scanf。它说:“下一个指针必须是指向char的指针,并且必须有足够的空间容纳字符串中的所有字符,**加上一个终止的null字节**”,这解释了这种行为。 - Vlad
这很有道理。我在%[上找不到太多信息。我没有意识到字符类可以匹配一个类中的多个字符。我以为它像%c一样。 - Evan
如果你只想要一个字符,可以使用 %1[。但是你仍然需要留出终止空字节的空间。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接