87 votes

Comment ajouter des chaînes de caractères à l'aide de sprintf ?

Je suis confronté à un sérieux problème avec sprintf .

Supposons que mon extrait de code soit :

sprintf(Buffer,"Hello World");
sprintf(Buffer,"Good Morning");
sprintf(Buffer,"Good Afternoon");
.
.
.

Quelques centaines de sprints....

Si je fais ça, ça va être écrasé.

Comment éviter l'écrasement en utilisant sprintf ? Si je donne un printf à la fin, je veux voir toutes les lignes.

15 votes

Je n'utiliserai pas sprintf mais snprintf, je n'utiliserai pas printf( str ) mais printf( "%s" , str )

136voto

Vous avez besoin :

sprintf(Buffer,"Hello World");
sprintf(Buffer + strlen(Buffer),"Good Morning");
sprintf(Buffer + strlen(Buffer),"Good Afternoon");

et bien sûr, votre tampon doit être suffisamment grand.

76voto

int length = 0;
length += sprintf(Buffer+length, "Hello World");
length += sprintf(Buffer+length, "Good Morning");
length += sprintf(Buffer+length, "Good Afternoon");

Voici une version avec une certaine résistance aux erreurs. Elle est utile si vous ne vous préoccupez pas de savoir si des erreurs se produisent, du moment que vous pouvez continuer votre chemin joyeusement quand elles se produisent.

int bytes_added( int result_of_sprintf )
{
    return (result_of_sprintf > 0) ? result_of_sprintf : 0;
}

int length = 0;
length += bytes_added(sprintf(Buffer+length, "Hello World"));
length += bytes_added(sprintf(Buffer+length, "Good Morning"));
length += bytes_added(sprintf(Buffer+length, "Good Afternoon"));

0 votes

Mais que se passe-t-il si sprintf subit un échec de conversion ?

2 votes

Ensuite, il y a de mauvaises choses qui arrivent. J'ai omis la vérification des erreurs pour des raisons de concision.

0 votes

+1 - La vérification supplémentaire des erreurs devrait être un exercice pour le lecteur de toute façon. Après tout, son leur code :)

33voto

Oleg Razgulyaev Points 2140

Pour des raisons de sécurité (dépassement de tampon), je recommande d'utiliser snprintf().

const int MAX\_BUF = 1000;
char\* Buffer = malloc(MAX\_BUF);

int length = 0;
length += snprintf(Buffer+length, MAX\_BUF-length, "Hello World");
length += snprintf(Buffer+length, MAX\_BUF-length, "Good Morning");
length += snprintf(Buffer+length, MAX\_BUF-length, "Good Afternoon");

9 votes

Le second argument de snprintf est non signé (size_t), cela signifie que si la longueur > MAX_BUF, alors MAX_BUF-length sera en dessous de la limite et snprintf écrira en dehors du tampon, créant ainsi un dépassement de tampon. Notez que le retour de snprintf est égal au nombre d'octets qui auraient été écrits si suffisamment d'espace avait été disponible et NON au nombre d'octets réellement écrits.

17voto

Michael Burr Points 181287

A snprintfcat() pour snprintf() :

size_t 
snprintfcat(
    char* buf,
    size_t bufSize,
    char const* fmt,
    ...)
{
    size_t result;
    va_list args;
    size_t len = strnlen( buf, bufSize);

    va_start( args, fmt);
    result = vsnprintf( buf + len, bufSize - len, fmt, args);
    va_end( args);

    return result + len;
}

11voto

Mr.32 Points 6553

Utilisez la valeur de retour de sprintf()

Buffer += sprintf(Buffer,"Hello World");
Buffer += sprintf(Buffer,"Good Morning");
Buffer += sprintf(Buffer,"Good Afternoon");

3 votes

C'est la meilleure solution, pas besoin de strlen

3 votes

Notez que vous devez également enregistrer l'adresse de départ du tampon pour référence ultérieure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X