不使用printf格式说明符的潜在问题

时间:2012-06-20 04:41:23

标签: c printf

  #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等。换句话说,这个程序的潜在问题是什么。

4 个答案:

答案 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