我试图找出C标准中printf()
打印的字符数允许的限制。我只在讨论论坛中找到answer,表示INT_MAX
。
例如,我检查了以下内容:
#include <stdio.h>
// INT_MAX 2147483647
int main()
{
int x=3;
int y = printf("%2147483647d \n\n", x); --> Confirms INT_MAX ?
// If I change the above to 2147483648, y in set to -1
printf("y = %d\n\n", y);
return 0;
}
我想问为什么printf()
受INT_MAX
的限制?任何人都可以指出C标准推理或源代码参考?
修改
我找到的最接近的答案是fprintf()
。在此link,在页568上,提到了它(在未定义的行为下):
The number of characters or wide characters transmitted by a formatted output
function (or written to an array, or that would have been written to an array) is
greater than INT_MAX.
以上是否也证明了printf()
?
答案 0 :(得分:1)
好吧,如果使用格式说明符%d打印,表示整数,当然最大可打印数字是INT_MAX。但你的例子是错的。您试图告诉它在数字上打印INT_MAX数字,但这当然远远超过实际数值INT_MAX。
至于为什么你的例子失败了,我想printf()存储要用整数打印的数字量。
答案 1 :(得分:1)
printf
返回打印的字符数,如果出现错误,则返回-1。其返回类型为int
。您可以存储的最大数量int
为INT_MAX
。
如果您尝试打印更多字符会怎样?然后printf
无法履行合同:返回写入的字符数。标准没有说明在合同无法履行时该怎么做,因此在这种情况下的行为未定义为未在标准中定义。
答案 2 :(得分:0)
&#34; Printf只打印结果&#34;。
换句话说,printf可以打印的字符数取决于指定的格式说明符。
printf的标准语法是,
int printf ( const char * format, ... );
这里基于&#34;格式&#34;,设置了字符数限制。
来自你的片段:
int y = printf("%2147483647d \n\n", x);
因为,指定的值与范围很好。
同样,当您将值更改为2147483648
时,它会超出范围。
答案 3 :(得分:0)
这应该是评论,但由于篇幅限制,我不得不提交这个答案。
#include<stdio.h>
#include<limits.h>
#include<malloc.h>
struct ec
{
char *c;
};
int main(void)
{
printf("INTMAX : %d\n",INT_MAX);
struct ec obj;
size_t max=(size_t)INT_MAX+1000;
size_t i;
obj.c=malloc(max*sizeof(char));
if(obj.c==NULL)
{
printf("Can't allocate such big memory chunk\n");
exit(0);
}
for(i=0;i<(max-1);i++)
obj.c[i]='0';
obj.c[i]='\0';
printf(obj.c); // This appear to print fine
/* Not bothered to put a free(obj.c) here*/
return 0;
}
我认为问题更多的是int
如何返回printf函数的类型。返回值是打印的字符数,因此每个字符打印时应递增。我想不出printf打印(INT_MAX + 1)第n个字符
注意:我忽略了编译器警告。