sscanf:获取字符串中的第一个和最后一个标记

时间:2011-06-28 17:47:58

标签: c scanf

是否可以通过使用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":

但它不起作用。

2 个答案:

答案 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