Printf() - 打印字符限制

时间:2016-04-29 07:06:35

标签: c++ c printf

我试图找出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()

4 个答案:

答案 0 :(得分:1)

好吧,如果使用格式说明符%d打印,表示整数,当然最大可打印数字是INT_MAX。但你的例子是错的。您试图告诉它在数字上打印INT_MAX数字,但这当然远远超过实际数值INT_MAX。

至于为什么你的例子失败了,我想printf()存储要用整数打印的数字量。

答案 1 :(得分:1)

声明

printf返回打印的字符数,如果出现错误,则返回-1。其返回类型为int。您可以存储的最大数量intINT_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个字符

时会发生什么

注意:我忽略了编译器警告。