2016-05-30 49 views
0

我想解析一个简单的字符串:一个字符集合“rgbcmyw”后面跟着一个字符形式集合“slh”然后一个整数。这个sscanf()格式的字符串有什么问题?

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:~$ 

为什么零被指定为'c'?

编辑:解

一个需要空间的字符进行扫描一个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; 
} 
+0

对于'%s'或'%[]',你通常应该包含一个字段宽度以防止它读取比你有空间多的字符(数组的大小减去1) – Dmitri

回答

2

您的代码传递错误类型的参数来sscanf()。该“%[]符期望一个char *指针。

+0

所以,声明应该是'char c [1],m [1];'? – Jamie

+0

而且你需要从参数中删除'&'。 –

+0

试过了。没有工作。删除'&',然后在'printf()'中添加'*'。 – Jamie

3

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

+0

指针一个字符串不存在。 Specifier []需要一个指向足够大小的字符数组的初始元素的指针(不必以null结尾),即指向char的指针:'char *' – 2501

+0

谢谢 - 修复。 –

+1

'期望指向char *的指针,而不是指向char的指针。“你是什么意思?指向char *的指针是char char,scanf指示符[]需要指向char的指针,char *是char *。 – 2501