如何将sscanf用于带空格的字符串?

时间:2011-12-09 11:00:42

标签: c

例如我有字符串:

34912512        34912767        a.b.c.d.e - i.f.g.h.i       HJ      -

此代码不起作用:

sscanf (line, "%ld\t%ld\t%s\t%s\t%s", &a, &b, &c, &d, &e );

3 个答案:

答案 0 :(得分:4)

这将读到换行符:

char a[123];
sscanf(line, "%[^\n]", a);

如果您还希望它在标签前阅读,您可以将其更改为:"%[^\t\n]"

由于您似乎已将此字符串读入缓冲区linesscanf的替代方法是strtok,它将返回指向line标记的指针(用空格,制表符等分隔。

答案 1 :(得分:2)

%s匹配不是空格字符的字节序列。所以它会在任何空格上停止。

假设您的输入是制表符分隔,这可能有效

sscanf(line, "%ld\t%ld\t%[^\t]\t%[^\t]\t%[^\t]", &a, &b, &c, &d, &e);

但请限制可以用%[^ \ t]读取的字符数,否则可能会有缓冲区溢出。还要检查sscanf()的返回值,以确保在依赖它们之前填充所有参数。

答案 2 :(得分:0)

我发现了这个问题,我想添加信息: 如果您想要分隔数据,请排除空格标签和减号字符,您可以这样做:

sscanf(line,"%d %d %s %*s %s %s %*s",&a,&b,c,d,e);

运算符%* s表示读取字符串但忽略不需要变量。 字符串的输出:

34912512        34912767        a.b.c.d.e - i.f.g.h.i       HJ      -
在sscanf之后:

printf("%d %d %s %s %s\n",a,b,c,d,e);

34912512 34912767 a.b.c.d.e i.f.g.h.i HJ