Frage

Ich verwende swprintf einen String in einen Puffer zu bauen (eine Schleife unter anderem verwendet wird).

const int MaxStringLengthPerCharacter = 10 + 1;
wchar_t* pTmp = pBuffer;
for ( size_t i = 0; i < nNumPlayers ; ++i)
{
    const int nPlayerId = GetPlayer(i);
    const int nWritten = swprintf(pTmp, MaxStringLengthPerCharacter, TEXT("%d,"), nPlayerId);
    assert(nWritten >= 0 );
    pTmp += nWritten;
}

*pTaskPlayers = '\0';

Wenn während der Prüfung assert nie trifft, kann ich sicher sein, dass es nie in Live-Code treffen wird? Das heißt, ich tun, wenn nWritten überprüfen müssen <0 und Griff das, oder kann ich sicher davon ausgehen, dass es kein Problem sein?

Unter welchen Umständen kann es -1 zurück? Die Dokumentation mehr oder weniger nur heißt es: „Wenn die Funktion fehlschlägt“. An einer Stelle habe ich gelesen, dass es wird scheitern, wenn es nicht die Argumente entsprechen kann (das heißt die Formatierung Zeichenfolge der varargs), aber das beunruhigt mich nicht.

Ich bin auch über nicht besorgt in diesem Fall durch Pufferüberlauf -. Ich weiß, dass der Puffer groß genug ist,

War es hilfreich?

Lösung

Von dem C99-Standard:

Die sprintf Funktion gibt die Anzahl der Zeichen in dem Array geschrieben, nicht das abschließende Nullzeichen zählt, oder einen negativen Wert, wenn ein Kodierungsfehler aufgetreten ist.

Dies geschieht in der Regel nur mit den Multi-Byte-und Wide-Zeichen-Zeichensatz-Funktionen.

Andere Tipps

Es kann mit falschem Format-String fehlschlagen, zum Beispiel, die nicht in Ihrem Fall passieren kann.

Wenn der Puffer nicht groß genug ist, kann es.

Ansonsten kein Grund, es zum Scheitern verurteilt.

In UNIX kann es fehlschlagen:

 EILSEQ
       A wide-character code that does not  correspond  to  a
       valid character has been detected.

 EINVAL
       There are insufficient arguments.

EILSEQ wurde bereits erwähnt.

Es kann auch fehlschlagen, SIGSEGV, wenn die Formatangabe die Daten nicht übereinstimmen - Beispiel einer% s Formatspezifizierer mit einem int mit 32-Bit-Beispiel:

int pdq=0xffffffff;
char tmp[32]={0x0};

sprintf(tmp, "%s", pdq);

Ich glaube, es einen anderen Fall, in dem snprintf () kann nicht gelingen. Es erscheint nicht in POSIX oder der aktuellen Linux-Manpage erwähnt zu werden.

Nach erfolgreichem Abschluss die snprintf () Funktion wird die Anzahl der Bytes zurück, die zu s geschrieben werden würde, wenn n ausreichend groß gewesen ohne den abschließenden Null-Byte.

snprintf () zurückkehrt int. Aber eine Eingabezeichenfolge größer als INT_MAX sein könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top