Если вы не знаете , когда пишете код число и тип (ы) аргументов, 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, но найти реализацию достаточно просто).