是否可以通过使用sscanf获取第一个令牌然后跳过一些令牌然后获取最后一个令牌?
例如,/ bin / ps -fu1000的输出
cm 2249 1548 0 0:00.00 ttys001 0:00.01 man sscanf
我试过了:
sscanf(line, "%s %[^\n]", user, cmd);
结果应为:
user = "cm";
cmd = "man sscanf":
但它不起作用。
答案 0 :(得分:3)
是的,但它很难看,无法正确检查错误。
/* assuming `user` and `cmd` are character arrays defined with 42 bytes */
if (sscanf(line, "%41s%*s%*s%*s%*s%*s%*s %41[^\n]", user, cmd) != 2) {
/* handle error */
} else {
/* hopefully ok */
}
您可以使用%*s
替换部分%*d
。 *
表示该项目已解析但未在任何地方分配(忽略该项目)。
在声明中,您的示例中有6个被忽略的项目与"cm"
和"man sscanf"
之间的项目相对应。
另请注意,我将输入限制为scanf本身的41个字符。确保不要在对象之外写字。
编辑:我在上次转化之前添加了空格,因为与%s
或%d
次转化不同,%[
转化不会跳过前导空格。
答案 1 :(得分:2)
也许你最好看看strtok