2013-02-08 11 views
12

Secondo http://linux.die.net/man/3/sprintf e http://www.cplusplus.com/reference/cstdio/sprintf/sprintf() e la famiglia restituisce il numero di caratteri scritti in caso di successo. In caso di errore, viene restituito un valore negativo. Suppongo che potrebbe verificarsi un errore se la stringa di formato non è corretta, pertanto un valore di ritorno negativo potrebbe indicare qualcosa di diverso da un errore malloc(). errno si imposta per indicare qual era l'errore?sprintf() valore di ritorno negativo e errno

risposta

9

C++ rinvia a C e C non richiede né menziona errno nella descrizione di sprintf() e familiare (sebbene per certi identificatori di formato, queste funzioni sono definite chiamare mbrtowc(), che può impostare EILSEQ in errno)

POSIX richiede che errno sia impostato:

Se si è verificato un errore di uscita, queste funzioni devono restituire un valore negativo e impostare errno per indicare l'errore.

EILSEQ, EINVAL, EBADF, ENOMEM, EOVERFLOW vengono menzionati esplicitamente: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html

5

mi piace sempre il metodo del "provare" quando ho una domanda come questa.

char buffer[50]; 
int n, localerr = 0; 
n = sprintf(buffer, "%s", "hello"); 
localerr = errno; // ensure printf doesn't mess with the result 
printf("%d chars\nerrno: %d\nstrerror:%s\n", n, localerr, strerror(localerr)); 

> 5 chars 
errno: 0 
strerror: Success 

n = sprintf(buffer, NULL, NULL); 
localerr = errno; 
printf("%d chars\nerrno: %d\nstrerror:%s\n", n, localerr, strerror(localerr)); 

> -1 chars 
errno: 22 
strerror: Invalid argument 

sembra che viene impostata quando si compila con gcc su linux. Quindi sono buoni dati e nello man page per errno menziona che printf() (stessa famiglia come sprintf()) può cambiare errno (negli esempi nella parte inferiore).

+0

+1 per la prova, ma la risposta di Cubbi ha trovato una documentazione più concreta. – cpburnz

+0

Si noti che il metodo "try it out" si basa sull'implementazione conforme allo standard e sullo standard che non consente spazio per comportamenti diversi. A volte questo metodo può ingannarti ... – skyking