Domanda

sto usando swprintf per costruire una stringa in un buffer (utilizzando un ciclo tra le altre cose).

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';

Se durante i test l'asserzione non colpisce, posso essere sicuro che non sarà mai colpito nel codice dal vivo? Cioè, ho bisogno di controllare se nWritten <0 e manico che, o posso tranquillamente assumere che non ci sarà un problema?

In quali circostanze può che tornare -1? La documentazione più o meno semplicemente afferma che "Se la funzione fallisce". In un posto che ho letto che fallirà se non può corrispondere gli argomenti (cioè la stringa di formattazione al varargs), ma che non mi preoccupa.

Sono anche non sono preoccupato per sovraccarico del buffer in questo caso -. So che il buffer è abbastanza grande

È stato utile?

Soluzione

Dalla serie C99:

  

La funzione sprintf restituisce il numero di caratteri scritti nella matrice, senza contare il carattere di terminazione null o un valore negativo se si è verificato un errore di codifica.

Questo in genere accade solo le funzioni multi-byte e set di caratteri carattere esteso.

Altri suggerimenti

E 'possibile che non con stringa di formato sbagliato, per esempio, che non può accadere nel tuo caso.

Se buffer non è abbastanza grande, può.

In caso contrario, non c'è ragione per il fallimento.

In UNIX, si può fallire:

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

 EINVAL
       There are insufficient arguments.

EILSEQ è già stato menzionato.

Si può anche fallire, SIGSEGV, quando l'identificatore di formato non corrisponde ai dati - ad esempio utilizzando un% s identificatore di formato con un int, 32 esempio bit:

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

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

Credo che ci sia un altro caso in cui snprintf () non può avere successo. Non sembra essere menzionato in POSIX o la corrente pagina di manuale di Linux.

  

Al completamento, la funzione snprintf () restituisce il numero di byte che verrebbero scritti s era stato n sufficientemente grande escluso il byte di terminazione null.

snprintf () restituisce int. Ma una stringa di input potrebbe essere più grande di INT_MAX.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top