我想解析一个简单的字符串:一个字符集合“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;
}
对于'%s'或'%[]',你通常应该包含一个字段宽度以防止它读取比你有空间多的字符(数组的大小减去1) – Dmitri