sscanf: получить первый и последний токен в строке - PullRequest
2 голосов
/ 28 июня 2011

Возможно ли с помощью 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 ]

3 голосов
/ 28 июня 2011

Да, но это уродливо и не может быть проверено на ошибки.

/* 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" в вашем примере.

Также обратите внимание, что я ограничил ввод 41 символом в самом scanf.Убедитесь, что вы не пишете вне объектов.


РЕДАКТИРОВАТЬ: Я добавил пробел перед последним преобразованием, потому что, в отличие от преобразований %s или %d, преобразование %[ не пропускает ведущийпробельные.

2 голосов
/ 28 июня 2011

Возможно, вам лучше взглянуть на strtok

...