2016-04-29 10 views
6

Ich versuche zu finden, was ist die zulässige Grenze für die Anzahl der Zeichen von printf() in der C-Standard gedruckt werden. Ich fand die answer nur in einem Diskussionsforum, das INT_MAX anzeigt.Printf() - gedruckte Zeichen Grenze

Zum Beispiel überprüfte ich die folgenden:

#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; 
} 

wollte ich fragen, warum printf() von INT_MAX begrenzt ist? Kann jemand auf eine C-Standard-Argumentation oder Quellcode-Referenz hinweisen?

bearbeiten

Die nächste Antwort war ich für fprintf() gefunden. Zu diesem link, auf Seite 568, seine erwähnt (unter undefinierten Verhalten):

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. 

Wird die oben für printf() rechtfertigen auch?

+0

Das 'printf()' ist begrenzt durch 'INT_MAX' ist nicht überraschend. Im Zweifelsfall ist es begrenzt durch 'INT_MAX'. –

+0

Aber was ist der Grund? – Jake

+2

Es verwendet offensichtlich "int" zum Speichern der Anzahl der gedruckten Zeichen. Sie können keinen Wert größer als 'INT_MAX' in' int' speichern. –

Antwort

1

Nun, wenn Sie mit dem Formatbezeichner% d drucken, was eine Ganzzahl angibt, wäre Ihre maximal druckbare Zahl natürlich INT_MAX. Aber dein Beispiel ist falsch. Sie versuchen, es INT_MAX Ziffern auf einer Zahl zu drucken, aber das übersteigt selbstverständlich den tatsächlichen numerischen Wert INT_MAX.

Warum Ihr Beispiel fehlschlägt, nehme ich an, printf() speichert die Anzahl der zu druckenden Ziffern in einer ganzen Zahl.

+0

Nun die Nummer zu drucken ist 3. Ich habe es mit '% 2d' versucht, die Ausgabe ist' 3'. Also seine Druckräume (1 weniger als die angegebene Anzahl) und dann die 3. Ist es immer noch falsch? – Jake

+0

Nun ist es falsch in dem Sinne, dass Sie nie in der Lage sein werden, eine Zahl mit INT_MAX Ziffern damit zu drucken, so dass viele Leerzeichen nur den Effekt haben, eine Menge von Räumen zu haben, die Sie nicht brauchen. – Magisch

+0

Kannst du den Schnitt sehen, den ich gemacht habe? – Jake

0

"Printf druckt nur das Ergebnis".

Mit anderen Worten, die Anzahl der Zeichen, die printf drucken kann, hängt vom angegebenen Formatspezifizierer ab.

Die Standardsyntax für printf ist,

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

hier auf "Format" wird die Zeichenanzahl Grenze gesetzt.

von Ihnen Snippet:

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

weil der angegebene Wert ist gut mit dem Bereich.

Auch wenn Sie den Wert auf 2147483648 geändert haben, wird der Bereich überschritten.

1

printf wird angegeben, um die Anzahl der gedruckten Zeichen oder -1 im Falle eines Fehlers zurückzugeben. Sein Rückgabetyp ist int. Die maximale Anzahl, die Sie speichern können, ist int ist INT_MAX.

Was passiert, wenn Sie versuchen, mehr Zeichen zu drucken? Dann printf kann seinen Vertrag nicht erfüllen: um die Anzahl der geschriebenen Zeichen zurückzugeben. Der Standard sagt nicht, was zu tun ist, wenn der Vertrag nicht erfüllt werden kann. Daher ist das Verhalten in diesem Fall nicht definiert, weil es nicht im Standard definiert ist.

0

Dies sollte ein Kommentar sein, aber aufgrund von Platzbeschränkungen musste ich dies als Antwort einreichen.

#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; 
} 

ich glaube, das Problem ist, mehr mit, wie int Rückgabetyp der Funktion printf. Der Rückgabewert ist die Anzahl der gedruckten Zeichen und sollte daher pro Zeichendruck erhöht werden. Ich kann mir nicht vorstellen, was passiert, wenn printf druckt (INT_MAX + 1) n-tes Zeichen

Hinweis: Ich habe die Compiler-Warnungen vernachlässigt.