这个sscanf()格式字符串有什么问题?

时间:2016-05-30 15:06:43

标签: c scanf

我试图解析一个简单的字符串:来自集合中的一个字符" rgbcmyw"然后是一个字符形式的集合" slh"然后是整数。

risk:9008:~$ cat test-scanf.c
#include <stdio.h>

int main(int argc, char ** argv) {
    char c,m;
    int s;

    printf("Scanned %d elements.\n", sscanf(argv[1], "%[rgbcmyw]%[slh]%d", &c, &m, &s));
    printf("Scanned:\n\tc = %c (%d)\n\tm = %c (%d)\n\ts = %d\n",c,c,m,m,s);

    return 0;
}
risk:9012:~$ gcc test-scanf.c && ./a.out rs40
Scanned 3 elements.
Scanned:
    c =  (0)
    m = s (115)
    s = 40
risk:9013:~$

为什么将零分配给&#39; c&#39;

编辑:解决方案

正在扫描的角色需要空间加上 nul终止:

#include <stdio.h>

int main(int argc, char ** argv) {
    char c[2],m[2]; /* Need space for the character *and* the 'nul' termination. */
    int s;

    printf("Scanned %d elements.\n", sscanf(argv[1], "%[rgbcmyw]%[slh]%d", c, m, &s));
    printf("Scanned:\n\tc = %s\n\tm = %s\n\ts = %d\n",c,m,s);

    return 0;
}

2 个答案:

答案 0 :(得分:3)

您正在使用string转化说明符和char指针。 %[foo]需要一个指向char的指针(并且必须有足够的空间容纳字符串中的所有字符,加上一个终止的空字节),而不仅仅是指向char的指针。

答案 1 :(得分:2)

您的代码将错误类型的参数传递给sscanf()。 “%[]说明符需要char *指针。