2013-02-08 11 views
12

Nach http://linux.die.net/man/3/sprintf und http://www.cplusplus.com/reference/cstdio/sprintf/sprintf() und Familie geben Sie die Anzahl der Zeichen bei Erfolg geschrieben. Bei einem Fehler wird ein negativer Wert zurückgegeben. Ich würde annehmen, dass ein Fehler auftreten könnte, wenn die Formatzeichenfolge fehlerhaft ist, so dass ein negativer Rückgabewert etwas anderes als einen malloc() Fehler anzeigen kann. Wird errno gesetzt, um anzuzeigen, was der Fehler war?Sprintf() negativen Rückgabewert und errno

Antwort

9

C++ aufschiebt bis C und C erfordert nicht oder erwähnen errno in der Beschreibung von sprintf() und Familie (obwohl für bestimmte Formatbezeich werden diese Funktionen definiert mbrtowc() zu nennen, welche EILSEQ in errno gesetzt werden)

POSIX erfordert, dass errno gesetzt:

Wenn ein Ausgang Fehler aufgetreten ist, werden diese Funktionen einen negativen Wert zurück und setzen errno den Fehler anzuzeigen.

EILSEQ, EINVAL, EBADF, ENOMEM, EOVERFLOW explizit erwähnt: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html

5

ich immer wie die "ausprobieren" -Methode, wenn ich eine Frage wie diese.

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 

Sieht aus wie es beim Kompilieren mit gcc auf Linux gesetzt wird. Also das sind gute Daten, und in der man page für errno es erwähnt, dass printf() (gleiche Familie wie sprintf()) errno (in den Beispielen auf der Unterseite) ändern können.

+0

+1 für den Beweis, aber Cubbis Antwort fand konkretere Dokumentation. – cpburnz

+0

Beachten Sie, dass die "try-out" -Methode darauf basiert, dass die Implementierung standardkonform ist und der Standard keinen Spielraum für unterschiedliches Verhalten bietet. Manchmal kann diese Methode Sie irreführen ... – skyking