这里是我的代码:C++错误:字符串格式化
void subroutine(const char *message) { printf(message); }
,这里是错误,我得到:
Error: In function ' ': warning: format not a string literal and no format arguements [-Wformat-security]
这里有什么错误?我无法解决它。
有什么建议吗?
这里是我的代码:C++错误:字符串格式化
void subroutine(const char *message) { printf(message); }
,这里是错误,我得到:
Error: In function ' ': warning: format not a string literal and no format arguements [-Wformat-security]
这里有什么错误?我无法解决它。
有什么建议吗?
您可以通过执行
printf("%s", message);
解决它,或者使用别的东西,比如fputs()的代替了printf。
gcc会警告您,因为它不知道您提供给printf的格式字符串,因此参数无法验证。
想象一下,你打电话给你的函数一样
message("It's 100%s");
这最终被printf("It's 100%s");
,这是错误的,并最终导致不确定behavio因为格式字符串包含一个%s
,你需要提供一个额外的参数给printf这是一个字符串..
您应该使用
printf("%s", message);
更详细的解释:
printf
将其第一个参数作为格式说明符处理。如果幸运的话,该消息不包含%s
或printf
专用的其他子字符串,则该消息将“按原样”打印。
但是,如果message
包含类似的东西,你的程序将尝试解释其他参数为printf
作为参数。由于没有实际的参数,例如,它会将一些任意的内存位置视为指针,并尝试对其进行解引用。这最好会导致崩溃;在最坏的情况下,这可能会泄露一些敏感数据。
(printf
甚至可以覆盖一些内存,如果%n
在格式字符串中遇到。)
如果传递"%d"
到subroutine
,你将有大麻烦,因为printf
会寻找另一种说法。
编译器提醒你,如果message
包含格式说明,程序可能会崩溃。
您可以使用vprintf
如果你打算写类似
void subroutine(const char *message, ...)
{
va_list args;
va_start(args, format);
vprintf(message, args);
va_end(args);
}
,但如果你只是想显示message
,使用puts(message)
或printf("%s", message)
。