Если вы не знаете , когда вы пишете код, количество и тип (и) аргументов, sscanf()
не могут безопасно делать то, что вы пытаетесь сделать.
Передача 50 аргументов в sscanf()
в порядке (аргументы, не потребляемые строкой формата, оцениваются, но игнорируются), но аргументы, соответствующие строке формата, должны быть ожидаемого типа после продвижения; в противном случае поведение не определено. Поэтому, если вы хотите определить, можно ли сканировать строку с помощью "%d"
или "%f"
, вы не можете безопасно сделать это с помощью одного вызова sscanf()
. (Вполне вероятно, вы могли бы уйти с пропусканием void*
, что указывает на достаточно большой буфер, но поведение все еще не определено.)
Другая неприятная проблема с sscanf()
является то, что он не обрабатывает цифровой переполнения. Это:
char *s = "9999999999999999999999999";
int n;
int result = sscanf(s, "%d", &n);
printf("result = %d, n = %d\n", result, n);
имеет неопределенное поведение (при условии, 9999999999999999999999999 слишком большой, чтобы хранить в int
).
Что-то вы могут быть в состоянии сделать, это найти открытый исходный код sscanf
реализации и изменить его так, он просто проверяет строку с форматом, без сохранения ничего. (Работа с лицензией для реализации оставлена как упражнение.) Это имеет смысл, если вы найдете строки стиля sscanf
, особенно удобные для вашей проблемы. В противном случае регулярные выражения, вероятно, подходят (не в стандарте C, но достаточно легко найти реализацию).
regex может быть полезно. – Hogan
@ Хоган: регулярные выражения Afaik не являются частью стандартной библиотеки C. – ryyst
@ryyst Они не являются стандартными c, но они POSIX – Dave