【问题标题】:Printf() - printed characters limitPrintf() - 打印字符限制
【发布时间】:2016-04-29 07:06:35
【问题描述】:

我试图找出在 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() 的合理性吗?

【问题讨论】:

  • printf()INT_MAX 限制并不奇怪。如果有疑问,它会受到INT_MAX 的限制。
  • 但是是什么原因呢?
  • 它显然使用int 来存储打印的字符数量。您不能在int 中存储大于INT_MAX 的值。
  • 规范说“十进制整数”。可以合理地假设这意味着 int
  • "以上内容是否也可以证明 printf() 的合理性?" 是的,根据 7.21.6.3/2 "printf 函数等效于带有参数的 fprintf标准输出插入 printf 的参数之前。”

标签: c++ c printf


【解决方案1】:

printf 表示返回打印的字符数或 -1 以防万一或出错。它的返回类型是int。您可以存储的最大数量是intINT_MAX

如果您尝试打印更多字符会怎样?那么printf 不能履行它的契约:返回写入的字符数。标准没有说明当合同无法履行时该怎么做,因此这种情况下的行为是未定义的,因为标准中没有定义。

【讨论】:

    【解决方案2】:

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

    至于您的示例失败的原因,我想 printf() 将要打印的位数存储在整数本身中。

    【讨论】:

    • 嗯,要打印的数字是3。我用%2d试了一下,输出是&lt;space&gt;3。所以它的打印空间(比我指定的数字少1)然后是3。它仍然是错误的吗?
    • 好吧,这是错误的,因为你永远无法用它打印一个带有 INT_MAX 数字的数字,所以指定很多空格只会产生一堆你没有空格的效果'不需要。
    • 我现在在 C 标准中找不到任何关于此的具体内容,但我敢打赌它的实现只是将要打印的数字数量存储在一个整数变量中。这是最合理的假设。
    【解决方案3】:

    “Printf 只打印结果”。

    换句话说,printf 可以打印的字符数取决于指定的格式说明符。

    printf 的标准语法是,

    int printf ( const char * format, ... );
    

    这里根据“格式”,设置字数限制。

    来自你的 sn-p:

    int y = printf("%2147483647d \n\n", x); 
    

    因为,指定的值与范围很好。

    同样,当您将值更改为 2147483648 时,它超出了范围。

    【讨论】:

      【解决方案4】:

      这应该是一个评论,但由于空间限制,我不得不提交这个作为答案。

      #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)nth 个字符时会发生什么

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-11
        • 2015-04-10
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多