Sscanf формат C ++ - PullRequest
       22

Sscanf формат C ++

5 голосов
/ 01 ноября 2011

У меня есть выражение sscanf как

sscanf (fieldname, "%s_%d", name, id);

Я предоставляю ввод как frog_461, но он отображает имя как "frog_461" и 0 для идентификатора. Можете ли вы предложить правильный способ дать вклад, чтобы сделать это заявление работает? Как в приведенном выше примере, как я должен дать свой ввод, чтобы name = "frog" и id = 461. Благодарю.


Я ценю весь ваш вклад. В настоящее время я не могу изменить код, поэтому я не пытаюсь найти альтернативный способ заставить его работать. Я просто проверяю, работал ли этот код ранее, и если да, то какие данные должен был предоставить пользователь, чтобы он работал. Спасибо.

Ответы [ 4 ]

13 голосов
/ 01 ноября 2011

Ответы, данные до сих пор с выделением ограничений sscanf, неверны! Существует правильный способ сделать это с помощью sscanf:

sscanf(fieldname, "%[^_]_%d", name, &id); 

%[^_] означает чтение, пока не встретится символ подчеркивания. См. Запись для [ на справочной странице для scanf .

Кроме того, обратите внимание на амперсанд перед id, необходимо передать указатель на id, чтобы изменить его из-за передачи семантики Си по значению.

Кстати, это действительно вопрос C, а не C ++, так что вы, вероятно, должны были пометить его как таковой. Если вы используете C ++, для разбора есть гораздо лучшие варианты, чем sscanf.

1 голос
/ 01 ноября 2011

Возможно, автор знает, что часть «идентификатора» его токена состоит только из букв (строчных букв английского алфавита), тогда он может попробовать

char name[32];
memset (name, 0, sizeof(name));
if (sscanf(fieldname, "%31[a-z]_%d", name, num)>=2) {
   /* do something */
} else {
   /* bad fieldname */
}

Будьте осторожны с sscanf для строк Cто есть массив символов) о переполнении буфера строки;всегда указывайте максимальный размер.

1 голос
/ 01 ноября 2011

%s читает, пока не встретит пробелы, он не знает, чтобы остановиться на подчеркивании. Один из способов сделать это - найти подчеркивание самостоятельно с помощью strchr. Затем вы знаете, где заканчивается первая часть строки, и число можно прочитать с помощью %d.

0 голосов
/ 01 ноября 2011

scanf не является обычным синтаксическим анализатором регулярных выражений, он обрабатывает только пробелы.

Вам нужно разделить входную строку, используя strtok () или аналогичный, или, если вы знаете формат, просто замените _ на ""

...