C printf格式字符串

时间:2012-10-01 15:46:38

标签: c printf

在C语言中,以下程序中的%5 %%, 但我不知道怎么做?

 printf("%6%5%%%78%");

3 个答案:

答案 0 :(得分:6)

这是未定义的行为,并且是特定于编译器/平台的。带有错误参数的Printf函数将开始从堆栈中翻译变量,然后发生任何事情。

这就是为什么编译器通常会抱怨这个

source.c:5:5: warning: conversion lacks type at end of format [-Wformat]
source.c:5:5: warning: conversion lacks type at end of format [-Wformat]
source.c:5:5: warning: conversion lacks type at end of format [-Wformat]
source.c:5:5: warning: spurious trailing '%' in format [-Wformat]

答案 1 :(得分:3)

Printf格式字符串后面应该跟有相同数量的参数,这显然没有在这里完成。

printf格式字符串的可能参数是:

%[flags][width][.precision][length]specifier

其中说明符是 s string c char 等。其他是可选的。

对于左对齐或右对齐,

标志是+, - ,0等中的一个,其中没有一个在问题中传递。

precision的前缀是。,所以在这个例子的情况下就是。

让我们来看看

printf("%6%5%%%78%");
  • 现在%之后的第一个参数被视为字段的宽度,即6和 因此不打印。但是,它需要一个特定的后者 其中找到另一个%。标准说%后跟%打印它 到stdout。因此,您首先看到%打印。现在因为%的影响是 丢失,所以5被处理并打印为正常数字。

  • 然后我们看到%%会打印一个%。接下来又是一个单一的 %,后跟78,预计为宽度,因此不打印。 然而,后一个%否定78的效果并打印a 单%。

要验证上述评估,这里是一个测试字符串

printf("%6%4%3%2");

按照上述规定打印%4%2。

详细参考 printf

答案 2 :(得分:0)

这里可能发生的事情是:

  • printf实现看到“%6”,它可以是有效转换规范的开头,例如“%6d”。
  • 然后它看到“%”,这不再是有效的转换规范。此时字符串不符合C标准(例如,C 1999 7.19.6.1 8说“完整转换规范应为%%。”),并且实现可以做任何事情。这个特定的实现似乎忽略了“6”,并且好像转换规范是“%%”而不是“%6%”。因此,它将“%”写入标准输出。
  • 然后printf实现看到“5”,所以它写“5”。
  • 然后它会看到“%%”,这是一个有效的转换规范,会导致写入“%”。
  • 然后它看到“%78%”。与“%6%”一样,“%78”可以启动有效规范,但第二个“%”错误。实现再次忽略“78”并写入“%”。

其他C实现中的行为会有所不同。该计划格式不正确;它不符合C标准,其行为未由C标准规定。