大家可能都或多或少在C/C++语言中用过sscanf处理字符串,不过我倒用得不多,上次用这个函数还是半年前了。
这回有同事在用sscanf读取一串字符到一个结构体,以填充结构体的各个项,测试时发现sscanf会过滤掉开头的空白字符。
比如有如下结构体:
typedef struct tagT
{
char a[3+1];
char b[5+1];
char c[3+1];
} T;
还有如下字符串:
char *s = “01 2 “;
用如下方法读取:
T t;
memset(&t, 0×00, sizeof(T));
sscanf(s, “%3s%5s%3s”, &t.a, &t.b, &t.c);
printf(“a=/%s/\tb=/%s/\tc=/%s/\n”, t.a, t.b, t.c);
运行之后,会发现读入的字符串跟想像中的不一样:
a=/01/ b=/2/ c=//
而我想要的结果是:
a=/01 / b=/ / c=/ 2 /
这里的问题解决方法非常简单,只要把”%3s%5s%3s”中的s改成c即可,在sscanf中,%s是遇到非空格字符才开始读取的,直到读取到空格字符结束,而%c会把空格也读进来。
正确的解法是:
sscanf(s, “%3c%5c%3c”, &t.a, &t.b, &t.c);
而通过这个问题,发现了一个使用sscanf函数滤掉字符串首尾空格的方法,即sscanf(str, “%s”, str);


