gpt4 book ai didi

c - 为什么 printf 无法正确处理标志、字段宽度和精度?

转载 作者:行者123 更新时间:2023-11-30 20:00:44 30 4
gpt4 key购买 nike

我正在尝试发现 printf 的所有功能,并且我已经尝试过:

printf("Test:%+*0d", 10, 20);

打印

Test:%+100d

我首先使用标志+,然后使用宽度*,然后重新使用标志0

为什么会产生这样的输出?我故意以一种的方式使用printf(),但我想知道为什么它显示的是数字100?

最佳答案

这是因为,您向编译器提供语法上的废话,因此它可以自由地做任何它想做的事情。相关阅读,undefined behavior .

在启用警告的情况下编译代码,它会告诉您类似的信息

warning: unknown conversion type character ‘0’ in format [-Wformat=]
printf("Test:%+*0d", 10, 20);
^

为了正确起见,该语句应该是以下之一

  • printf("测试:%+*.0d", 10, 20);//注意“.”

    其中,0 用作精度

    相关,引用 C11,第 §7.21.6.1 章,(强调我的)

    An optional precision that gives the minimum number of digits to appear for the d, i, o, u, x, and X conversions, the number of digits to appear after the decimal-point character for a, A, e, E, f, and F conversions, the maximum number of significant digits for the g and G conversions, or the maximum number of bytes to be written for s conversions. The precision takes the form of a period (.) followed either by an asterisk * (described later) or by an optional decimal integer; if only the period is specified, the precision is taken as zero. If a precision appears with any other conversion specifier, the behavior is undefined.

  • printf("测试:%+0*d", 10, 20);

    其中,0 用作标志。根据语法,所有标志应该一起出现在任何其他转换规范条目之前,您不能将其任何地方放在转换规范中并期望编译器遵循您的意图

    再次引用,(以及我的强调)

    Each conversion specification is introduced by the character %. After the %, the following appear in sequence:

    • Zero or more flags (in any order) [...]
    • An optional minimum field width [...]
    • An optional precision [...]
    • An optional length modifier [...]
    • A conversion specifier [....]

关于c - 为什么 printf 无法正确处理标志、字段宽度和精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40575096/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com