例如我有字符串:
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 );
答案 0 :(得分:4)
这将读到换行符:
char a[123];
sscanf(line, "%[^\n]", a);
如果您还希望它在标签前阅读,您可以将其更改为:"%[^\t\n]"
由于您似乎已将此字符串读入缓冲区line
,sscanf
的替代方法是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 -
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