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-й символ
Примечание: Я пренебрег предупреждениями компилятора.