gpt4 book ai didi

c - 重复 printf 说明符标志时的行为是什么?

转载 作者:太空狗 更新时间:2023-10-29 16:41:26 26 4
gpt4 key购买 nike

fprintf() 系列函数有 5 个 flag 字符 '-', '+', ' ', '#', '0'.

当标志被重复时,指定的行为是什么?

#include <stdio.h>
int main(void) {
printf("% d\n", 12); // 12
printf("%00d\n", 34); // 34
printf("%++d\n", 56); // +56
printf("%00*d\n", 5, 78); // 00078
return 0;
}

在我的 gcc“i686-pc-cygwin/4.9.2”中,我收到“警告:格式为 [-Wformat=] 的重复‘’标志”,所以我认为这是正确的行为 --> 警告用户并允许重复的标志。

我还没有找到针对在尝试编写格式解析器时发现的这个角落问题的 C99/C11 规范指南。

如果允许重复,下面的代码是可以的。如果不允许重复,第二个0就是宽度。然后说明符有2个宽度0*,这是另一个问题。

// -------v
printf("%00*d\n", 5, 78); // 00078

最佳答案

在我看来,标准在这一点上并不清楚。

gcc 的作者明确认为重复的标志是无效的,因为 gcc 默认会发出警告,例如:

printf("%++d\n", 42);

但这并不一定能告诉我们标准作者的意图。

标准允许:

Zero or more flags (in any order) that modify the meaning of the conversion specification.

标志是-+space#0。我认为,短语“零个或多个标志*”专门用于允许组合不同的标志。例如,这个:

#include <stdio.h>
int main(void) {
printf("|%6x|\n", 0x123);
printf("|%-6x|\n", 0x123);
printf("|%#6x|\n", 0x123);
printf("|%-#6x|\n", 0x123);
printf("|%#-6x|\n", 0x123);
}

有效并产生此输出:

|   123|
|123 |
| 0x123|
|0x123 |
|0x123 |

在其他情况下,该标准明确规定了构造是否可以重复。例如,long long int 不同于long intlong int int 是语法错误。另一方面,该标准明确指出 (N1570 6.7.3p5):

If the same qualifier appears more than once in the same specifier-qualifier-list, either directly or via one or more typedefs, the behavior is the same as if it appeared only once.

这里没有任何这样的声明让我怀疑标准的作者没有考虑重复相同标志的情况。

如果我对此有误,并且委员会确实打算将重复的标志等同于单个标志,那么您的格式解析器应该将它们视为等同的。如果我是正确的,那么重复同一标志的行为是未定义的,您的实现可以做任何您喜欢的事情——包括将它们视为等同于一个标志。

无论哪种情况,您都可以随意发出警告。即使标准定义了重复标志的行为,它仍然可以说是糟糕的风格,值得警告。

关于c - 重复 printf 说明符标志时的行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29611704/

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