Как мне разобрать три значения из строки в C, используя sscanf, когда одно в двойных кавычках? - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь проанализировать три строки из большей строки, но анализируются только первые два значения.Что-то не так с моей строкой формата, используемой sscanf?

Я уже пытался использовать "% s% [^ \ n \ t \ ^] s% s \ n" в качестве строки формата, и этоработает для первых двух значений, но третье остается пустым.

printf(">> ");
fflush(stdout);
fgets(input, MAX_STR, stdin);
sscanf(input, "%s %[^\t\n]s\n", command, value);

/* parse it differently if the command is average*/
if(!strcmp(command, "average")) {
  /* clear the values */
  strcpy(command, "");
  strcpy(reference, "");
  strcpy(value, "");

  /* re-parse the input */    
  sscanf(input, "%s \"%[^\t\n\"]s\" %[^\t\n]s\n", command, reference, value);
}

printf("command: %s reference: %s value: %s\n");

Я ожидаю, что, если я наберу, скажем ... средний "cody" 500, оператор print в конце будетprint

команда: средняя ссылка: значение cody: 500

, но вместо этого она печатает

команда: средняя ссылка: значение cody:

по какой-то причинестрока значения обрезается при разборе.

1 Ответ

2 голосов
/ 12 июня 2019

Если входная строка имеет вид ...

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' также не имеет смысла.

...