#include <stdio.h>
void wrapperPrint(char* s)
{
printf(s);
return;
}
int main()
{
wrapperPrint("Hello world\n");
wrapperPrint("This is a string");
return 0;
}
如果程序正确打印字符串(确实在gcc 4.6.3上测试过),为什么我们需要格式说明符,如%d,%s等。换句话说,这个程序的潜在问题是什么。
答案 0 :(得分:6)
按原样,完全没问题。但是,如果传入包含百分号的字符串,则可能会导致问题,因为printf
会尝试将其视为转换说明符的开头,但1)转换说明符的其余部分可能不会出现,2)当你调用printf
时,你也不会传递一个匹配的参数,所以如果你传递了一个正确的转换说明符,它会尝试使用一个不存在的参数(给出undefined)行为)。
答案 1 :(得分:4)
为什么我们需要像%d,%s等格式说明符?
printf
不是 格式安全 。 t本身不理解 type ,你必须明确告诉printf
数据参数的格式( type )。它告诉print
如何将参数解释为,如果不这样做,只需将其视为字符串(,如示例代码)。
请注意,如果格式说明符和实际数据类型不匹配,那么您获得的是 未定义的行为 。
答案 2 :(得分:2)
你应该使用puts(),或者执行printf(“%s”,s);
如果格式字符串恰好包含%s或任何其他格式,则printf将尝试读取您未传递的参数,尝试访问随机内存块,并且结果未定义。
尝试使用传入%s的程序运行程序,看看会发生什么。然后尝试在valgrind下再次运行它以真正看到正在发生的可怕事情。
答案 3 :(得分:1)
没有任何要求在printf
中使用格式说明符。相反,这是因为您希望根据您使用printf
的某种格式打印字符串。您可以使用其他方法(puts
)来输出纯字符串。
对于上面的程序,如果字符串中有格式说明符,程序将打印垃圾,因为您仍然会在下面调用printf
。