2012-10-01 151 views
-5

在C语言中,出来下面的程序是%5 %%, 但我不知道怎么做?C printf格式字符串

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

你不知道怎么回事? –

+3

我可能是错的,但它看起来不像'printf'的有效格式字符串...,而对于C99§7.19.6.1¶9,“如果转换规范无效,行为未定义。” 。 –

+0

@AxelIsouard他可能意思是'我不知道为什么'。 – Dan

回答

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] 
+0

但是,我在Dev编译器上运行此声明,成功运行。我在考试中得到了这个问题,他们也在测试后才提出这个问题。 –

+4

@AsdAsd:“任何事情都可能发生,程序不合格”和“编译”之间并不矛盾。想想,只要需要。这是一个非常重要的问题。 –

+2

@Asd:只是因为某些*出现*才能运行正常,并不意味着它是正确的。你也应该考虑在一所更好的学校换个课程,如果你把这种事情当作考试问题的话。 –

3

格式化字符串之后,应当相等数量的这显然不是在这里完成的论点。

可能的参数,以格式化字符串是:

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

其中说明符是小号Ç等其他是可选的。

标志是+, - ,0等之一,用于左对齐或右对齐,其中没有一个在问题中传递。

精度前缀为。,所以在这个例子的情况下,它是失败的。

让我们看一下

printf("%6%5%%%78%"); 
  • 现在%后的第一个参数被作为场即6的宽度和 因此不印刷。但是,它期望一个说明符后者代替 ,其中找到另一个%。标准说%跟着%打印它到标准输出 。因此,你首先看到打印%。现在因为%的影响是 丢失,所以5被作为一个正常的数字处理和打印。

  • 然后我们看到%%会打印一个%。接下来又是一个 %,其次是78,这是预期的宽度,因此不打印。 但是,后面的另一个%会否定78的效果并打印出单个%。

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

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

它打印%4%2符合以上。

详细参考 printf

0

什么可能发生在这里的是:

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

该行为在其他C实现中会有所不同。该方案不合格;它不符合C标准,其行为不是由C标准规定的。