2016-04-29 33 views
6

Sto cercando di trovare qual è il limite consentito per il numero di caratteri da stampare da printf() nello standard C. Ho trovato solo lo answer in un forum di discussione, che indica INT_MAX.Printf() - limite di caratteri stampati

Per esempio, ho controllato il seguente:

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

Volevo chiedere perché è printf() limitato dalla INT_MAX? Qualcuno può indicare un ragionamento standard C o un riferimento al codice sorgente?

Modifica

La risposta più vicina che ho trovato è stato per fprintf(). A questo link, a pagina 568, la sua menzionata (sotto un comportamento indefinito):

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. 

Può la sopra giustificare per printf() pure?

+0

Questo 'printf()' è limitato da 'INT_MAX' non è sorprendente. In caso di dubbio, è limitato da 'INT_MAX'. –

+0

Ma qual è la ragione? – Jake

+2

Ovviamente utilizza 'int' per memorizzare la quantità di caratteri stampati. Non è possibile memorizzare un valore superiore a 'INT_MAX' in' int'. –

risposta

1

Bene, se si stampa con l'identificatore di formato% d, che indica un numero intero, ovviamente il numero massimo stampabile sarebbe INT_MAX. Ma il tuo esempio è sbagliato. Stai provando a dirgli di stampare cifre INT_MAX su un numero, ma che, ovviamente, supera di gran lunga il valore numerico effettivo INT_MAX.

Per quanto riguarda il motivo dell'esito negativo, suppongo che printf() memorizzi la quantità di cifre da stampare in un numero intero stesso.

+0

Bene il numero da stampare è 3. Ho provato con '% 2d', l'output è' 3'. Quindi i suoi spazi di stampa (1 in meno del numero che ho specificato) e poi il 3. E 'ancora sbagliato? – Jake

+0

Beh, è ​​sbagliato, nel senso che non potrai mai stampare un numero con cifre INT_MAX con esso, quindi specificando che molti spazi avranno l'effetto di avere un sacco di spazi che non ti servono. – Magisch

+0

Riesci a vedere la modifica che ho apportato? – Jake

0

"Printf stampa solo il risultato".

In altre parole, il numero di caratteri che printf può stampare dipende dall'indicatore di formato specificato.

La sintassi standard per printf è,

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

qui sulla base di "format", il limite di conteggio dei caratteri è impostato.

da voi frammento:

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

perché, il valore specificato va bene con la gamma.

Allo stesso modo, quando si modifica il valore in 2147483648 si va oltre l'intervallo.

1

printf è indicato per restituire il numero di caratteri stampati o -1 in caso o un errore. Il suo tipo di ritorno è int. Il numero massimo che è possibile memorizzare è int è INT_MAX.

Cosa succede se provi a stampare più caratteri? Quindi printf non può adempiere al suo contratto: restituire il numero di caratteri scritti. Lo standard non dice cosa fare quando il contratto è impossibile da soddisfare, quindi il comportamento in questo caso è indefinito perché non viene definito nello standard.

0

Questo dovrebbe essere un commento ma a causa delle restrizioni di spazio, ho dovuto presentare questo come risposta.

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

Credo che il problema è più di come int tipo di ritorno della funzione printf. Il valore restituito è il numero di caratteri stampati e quindi dovrebbe essere incrementato per carattere di stampa. Non riesco a pensare a cosa succede quando printf prints (INT_MAX + 1) n. Carattere

Nota: Ho trascurato gli avvisi del compilatore.

Problemi correlati