Если входная строка имеет вид ...
command "reference" value
... где command
и value
не имеют пробелов, код может использовать:
char command[100], reference[100], value[100];
int n = 0;
sscanf(input, "%99s \"%99[^\"]\" %99s %n", command, reference, value, &n);
if (n > 0 && input[n] == 0) {
// success
printf("command: '%s' reference: '%s' value: '%s'\n", command, reference, value);
}
При успешном сканировании будет установлено значение n
, а input[n]
будет нулевым символом .
За анализом часто проще следить, разбивая формат
#define FMT_CMD "%99s"
#define FMT_REF " \"%99[^\"]\""
#define FMT_VAL "%99s"
sscanf(input, FMT_CMD FMT_REF FMT_VAL " %n",
command, reference, value, &n);
При sscanf(input, "%s %[^\t\n]s\n", command, value);
нет ограничения по ширине для command, value
с риском переполнения буфера. финал 's'
в формате не имеет смысла. Конечный формат '\n'
также не имеет смысла.