Question

J'utilise swprintf pour construire une chaîne dans un tampon (en utilisant une boucle entre autres).

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

Si au cours de l'essai assert frappe jamais, puis-je être sûr qu'il ne sera jamais frappé dans le code en direct? C'est, dois-je vérifier si nWritten <0 et poignée, ou puis-je supposer sans risque qu'il n'y aura pas un problème?

Dans quelles circonstances peut-il revenir -1? La documentation plus ou moins précise que « Si la fonction échoue ». Dans un endroit où je l'ai lu qu'il échouera si elle peut ne pas correspondre aux arguments (à savoir la chaîne mise en forme au varargs) mais cela ne me inquiète pas.

Je suis aussi pas inquiet au sujet de dépassement buffer dans ce cas -. Je sais que le tampon est assez grand

Était-ce utile?

La solution

De la norme C99:

  

La fonction sprintf retourne le nombre de caractères écrits dans l'ensemble, sans compter le caractère nul de terminaison, ou une valeur négative si une erreur de codage est produite.

Cela se produit généralement que les fonctions jeu de caractères de caractères multi-octets et large.

Autres conseils

Il peut échouer avec chaîne de format incorrect, par exemple, qui ne peut se produire dans votre cas.

Si le tampon n'est pas assez grand, il peut.

Dans le cas contraire, aucune raison de faire échouer.

Dans UNIX, il peut échouer:

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

 EINVAL
       There are insufficient arguments.

EILSEQ a déjà été mentionné.

Il peut aussi échouer, SIGSEGV, lorsque le spécificateur de format ne correspond pas aux données - par exemple en utilisant le spécificateur de format% s avec un int, 32 bits par exemple:

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

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

Je crois qu'il ya un autre cas où snprintf () ne peut pas réussir. Il ne semble pas être mentionné dans POSIX ou la page de manuel Linux actuel.

  

En cas de réussite, la fonction snprintf () renvoie le nombre d'octets qui seraient écrits à l'art avait n été suffisamment volumineux à l'exception de l'octet nul final.

rendements snprintf (int). Mais une chaîne d'entrée pourrait être plus grande que INT_MAX.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top