Printf () - ограничение печатных символов

Я пытаюсь найти, что такое допустимый предел для количества символов, которые будут напечатаны printf() в стандарте C. Я только нашел ответ в дискуссионном форуме, который указывает INT_MAX.

например, я проверил следующее:

#include <stdio.h>

// INT_MAX  2147483647

int main()
{
    int x=3;

    int y = printf("%2147483647d nn", x); --> Confirms INT_MAX ?

    // If I change the above to 2147483648, y in set to -1
    printf("y = %dnn", y);

    return 0;
} 

Я хотел спросить, почему printf() ограничен INT_MAX ? Может ли кто-нибудь указать стандартное рассуждение C или ссылку на исходный код ?

редактировать

в ближайший ответ, который я нашел, был для fprintf(). При этом ссылке, на странице 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 ответов


Ну, если вы печатаете со спецификатором формата %d, который указывает целое число, конечно, ваше максимальное число для печати будет INT_MAX. Но ваш пример неверен. Вы пытаетесь сказать ему печатать цифры INT_MAX на числе, но это, конечно, намного превышает фактическое числовое значение INT_MAX.

Что касается того, почему ваш пример терпит неудачу, я полагаю, что printf() хранит количество цифр для печати в целочисленном числе.


возвращает количество напечатанных символов или -1 в случае ошибки. Его возвращаемый тип -int. Максимальное число, которое вы можете хранить, -int is INT_MAX.

что произойдет, если вы попытаетесь напечатать больше символов? Тогда printf не может выполнить свой контракт: вернуть количество написанных символов. Стандарт не говорит, что делать, когда контракт невозможно выполнить, поэтому поведение в этом случае не определено тем, что не определено в стандарте.


"Printf просто печатает результат".

другими словами, количество символов, которые printf может печатать, зависит от указанного спецификатора формата.

стандартный синтаксис для printf,

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

здесь на основе "формат" устанавливается ограничение количества символов.

от вас фрагмент:

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

так, указанное значение С диапазона.

аналогично, при изменении значения!--2--> Она идет вне пределов досягаемости.


Это должен был быть комментарий, но из-за ограниченного пространства, я должен был представить это как ответ.

#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]='';
    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-й символ

Примечание: Я пренебрег предупреждениями компилятора.