我一直试图让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*
的警告。
论证实际上应该是什么类型,还是我犯了其他错误?
答案 0 :(得分:3)
sscanf
需要一个字符串。
char num1[BIG_ENOUGH], num2[BIG_ENOUGH];
s = sscanf("1,2", " %[01234567] , %[01234567]", num1, num2);
当然这完全不安全,因为扫描的字符串加上终止的空值可能比缓冲区长,导致缓冲区溢出。
不幸的是,C类型系统无法区分指向字符数组开头的指针和指向单个字符的指针,因此编译问题中的代码。