回答
这是未定义的行为,是编译器/平台特定的。具有错误参数的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]
但是,我在Dev编译器上运行此声明,成功运行。我在考试中得到了这个问题,他们也在测试后才提出这个问题。 –
@AsdAsd:“任何事情都可能发生,程序不合格”和“编译”之间并不矛盾。想想,只要需要。这是一个非常重要的问题。 –
@Asd:只是因为某些*出现*才能运行正常,并不意味着它是正确的。你也应该考虑在一所更好的学校换个课程,如果你把这种事情当作考试问题的话。 –
格式化字符串之后,应当相等数量的这显然不是在这里完成的论点。
可能的参数,以格式化字符串是:
%[flags][width][.precision][length]specifier
其中说明符是小号为串,Ç为炭等其他是可选的。
标志是+, - ,0等之一,用于左对齐或右对齐,其中没有一个在问题中传递。
精度前缀为。,所以在这个例子的情况下,它是失败的。
让我们看一下
printf("%6%5%%%78%");
现在%后的第一个参数被作为场即6的宽度和 因此不印刷。但是,它期望一个说明符后者代替 ,其中找到另一个%。标准说%跟着%打印它到标准输出 。因此,你首先看到打印%。现在因为%的影响是 丢失,所以5被作为一个正常的数字处理和打印。
然后我们看到%%会打印一个%。接下来又是一个 %,其次是78,这是预期的宽度,因此不打印。 但是,后面的另一个%会否定78的效果并打印出单个%。
为了这里验证上述评估是一个测试字符串
printf("%6%4%3%2");
它打印%4%2符合以上。
详细参考 printf
什么可能发生在这里的是:
- 的printf的执行看见“%6”,它可以是一个有效的转换规范的开始,如“%6D ”。
- 然后它看到“%”,这不再是一个有效的转换规范。此时该字符串不符合C标准(例如C 1999 7.19.6。1 8表示“完整的转换规范应为%%”),并且实现可以做任何事情。这个特定的实现看起来忽略了“6”,并且好像转换规范是“%%”而不是“%6%”。因此,它将“%”写入标准输出。
- 然后printf实现看到“5”,所以它写入“5”。
- 然后它会看到“%%”,这是导致写入“%”的有效转换规范。
- 然后它看到“%78%”。与“%6%”一样,“%78”可以开始有效规范,但第二个“%”错误。实施再次忽略了“78”并写入“%”。
该行为在其他C实现中会有所不同。该方案不合格;它不符合C标准,其行为不是由C标准规定的。
- 1. 解析Objective-C printf格式字符串?
- 2. 将C++ printf格式转换为VB .NET字符串格式
- 3. printf浮点值的字符串格式
- 4. 通过printf格式输出字符串
- 5. PHP:使用printf格式化字符串
- 6. 如何将C风格的printf格式转换为C#字符串格式?
- 7. C - 格式字符数组像printf
- 8. C:仅使用字符串格式作为参数的printf
- 9. 用于生成printf格式字符串的C宏
- 10. 查找C++字符串中的第一个printf格式序列
- 11. C printf字符串说明符\ t1?
- 12. 格式化C字符串
- 13. 格式字符串在C#
- 14. C#字符串格式
- 15. c#字符串格式
- 16. 格式字符串.NET C#
- 17. C++格式字符串宏
- 18. 字符串格式化C#
- 19. C#格式的字符串
- 20. 格式字符串C++
- 21. C#+字符串格式化
- 22. C printf格式化
- 23. 预解析(高速缓存)printf风格的格式字符串
- 24. 用字符串替换printf中的格式
- 25. 什么是固定字符串的printf格式?
- 26. 当通过'%c'打印换行符时,Printf部分忽略格式字符串
- 27. 传递字符串给printf,在C
- 28. printf()将不会打印字符串c
- 29. C - 结构数组的printf字符串
- 30. 字符串和字符与printf的
你不知道怎么回事? –
我可能是错的,但它看起来不像'printf'的有效格式字符串...,而对于C99§7.19.6.1¶9,“如果转换规范无效,行为未定义。” 。 –
@AxelIsouard他可能意思是'我不知道为什么'。 – Dan