【问题标题】:What argument type does sscanf expect for a character class?sscanf 期望字符类的参数类型是什么?
【发布时间】:2010-10-31 10:33:54
【问题描述】:

我一直试图让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(或其他大于一个字节的内容),那么它会按预期工作,但我会收到有关 format expects type char* 的警告。

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

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    sscanf 需要一个字符串。

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

    当然这是完全不安全的,因为扫描的字符串加上终止的 null 可能比缓冲区长并导致缓冲区溢出。

    不幸的是,C 类型系统无法区分指向字符数组开头的指针和指向单个字符的指针,因此编译了问题中的代码。

    【讨论】:

    • 这不是sscanf 实现中的错误吗?根据documentation,对于%c,“末尾没有附加空字符”。然而,我没有找到任何描述%[...]-like 参数的文档。
    • 我找到了所需的文档:linux.die.net/man/3/scanf。它说“下一个指针必须是指向 char 的指针,并且字符串中的所有字符必须有足够的空间,加上一个终止的空字节”,这解释了这种行为。
    • 这是有道理的。我在%[ 上找不到太多信息。我没有意识到每个类可以匹配多个字符。我以为就像%c
    • 如果您只需要一个字符,请使用%1[。但是你仍然需要空间来存放终止的空字节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多