我有一个程序从命令行获取一个格式字符串,表示多个输出文件的文件名格式。它应该只需要一个可以替换的整数参数来生成实际的输出文件名,并且我想在进行输入检查时验证它。什么是确定格式字符串在C中所期望的参数数量的好方法?
答案 0 :(得分:1)
接受的参数数量取决于C库的版本(例如,在C99中添加了%a
转换说明符)。您可以确定它不大于未转义%
个字符的数量(即,删除所有%
个序列后剩余的%%
个字符数)加上{{ 1}}个字符(可以是宽度说明符)。
但是你应该考虑安全问题;如果用户提供*
格式说明符,则可能导致写入任意内存位置。在其他情况下,例如供应%n
将导致输出垃圾值,%f
在任意内存中,甚至使用%s
说明符允许用户提供字段宽度,例如%d
可能导致缓冲区溢出。考虑不同的格式化方案会更聪明,例如替换令牌(可能仍为%255d
),但不允许用户提供%d
格式字符串。
答案 1 :(得分:1)
GNU C 库包含一个函数 parse_printf_format
,可以在您的情况下使用。来自the glibc manual, section 12.12.10 - Parsing a template string:
您可以使用函数 parse_printf_format 获取有关给定模板字符串预期的参数数量和类型的信息。此函数允许为 printf 提供接口的解释器避免从用户程序传递无效参数,这可能导致崩溃。
<块引用>parse_printf_format 返回模板所需的参数总数。如果此数字大于 n,则返回的信息仅描述前 n 个参数。如果您需要有关其他参数的信息,请分配一个更大的数组并再次调用 parse_printf_format。
用例示例:
#include <printf.h>
size_t arguments_count = parse_printf_format ("Your discount: %d%%\n", 0, NULL);
/* arguments_count now holds a value of 1 */