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
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
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).
+1 per la prova, ma la risposta di Cubbi ha trovato una documentazione più concreta. – cpburnz
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