2012-03-29 120 views
0

这里是我的代码:C++错误:字符串格式化

void subroutine(const char *message) { printf(message); } 

,这里是错误,我得到:

Error: In function ' ': warning: format not a string literal and no format arguements [-Wformat-security] 

这里有什么错误?我无法解决它。

有什么建议吗?

回答

1

您可以通过执行

printf("%s", message); 

解决它,或者使用别的东西,比如fputs()的代替了printf。

gcc会警告您,因为它不知道您提供给printf的格式字符串,因此参数无法验证。

想象一下,你打电话给你的函数一样

message("It's 100%s"); 

这最终被printf("It's 100%s");,这是错误的,并最终导致不确定behavio因为格式字符串包含一个%s,你需要提供一个额外的参数给printf这是一个字符串..

3

您应该使用

printf("%s", message); 

更详细的解释:

printf将其第一个参数作为格式说明符处理。如果幸运的话,该消息不包含%sprintf专用的其他子字符串,则该消息将“按原样”打印。

但是,如果message包含类似的东西,你的程序将尝试解释其他参数为printf作为参数。由于没有实际的参数,例如,它会将一些任意的内存位置视为指针,并尝试对其进行解引用。这最好会导致崩溃;在最坏的情况下,这可能会泄露一些敏感数据。

printf甚至可以覆盖一些内存,如果%n在格式字符串中遇到。)

0

如果传递"%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)