web-dev-qa-db-fra.com

Construire des chaînes à partir de variables en C

Je travaille sur un jeu de blackjack sans faille qui utilise des sockets, grâce à ma classe de systèmes d'exploitation. On nous a déjà donné une interface de socket qui fait passer un tableau de caractères dans les deux sens.

J'avais espéré je pouvais faire quelque chose comme ceci:

char[] msgOut = printf("Dealer's Card is %C %C", char1, char2);
sendMsg(msgOut);

CEPENDANT, googler me conduit à déterminer que la valeur de retour de printf est un entier du nombre de sorties de Char, pas un caractère [] des caractères eux-mêmes (comme je l'avais espéré).

Existe-t-il une autre fonction C qui me permet de construire des chaînes à partir de mes variables?

15
Raven Dreamer

printf écrit sur la sortie standard. snprintf accomplit ce que vous allez faire ici. La chaîne interpolée est stockée dans 'buffer' après l'appel de snprintf. Vous voudrez peut-être définir votre taille de tampon un peu plus intelligemment, mais ceci n’est qu’un exemple.

char buffer[1024];
snprintf(buffer, sizeof(buffer), "Dealer's Card is %C %C", char1, char2);
26
Ed S.

Glibc (et plusieurs autres bibliothèques C) ont une fonction pratique asprintf .

char *msgOut;
asprintf(&msgOut, "Dealer's Card is %C %C", char1, char2);
sendMsg(msgOut);
free(msgOut);

Ceci est particulièrement utile lorsque vous ne disposez pas d'une bonne prévision avancée pour la quantité de mémoire requise pour contenir la chaîne. (Si vous le faites, snprintf a moins de temps système car il n'alloue pas de mémoire de manière dynamique.)

Sur les systèmes sans asprintf, mais avec une snprintf conforme aux normes, elle peut être implémentée par deux appels à snprintf - tout d'abord sans mémoire tampon ni taille zéro pour déterminer la longueur de la chaîne, une malloc intermédiaire, puis une seconde fois en utilisant cet espace nouvellement alloué .

8
ephemient

Si vous voulez un constructeur de chaînes en c qui alloue dynamiquement de la mémoire, j'ai trouvé http://linux.die.net/man/3/vasprintf d'être utile.

Exemple:

#include <stdio.h>

int i;
printf("//Simple dynamic string builder:\n");
char *strs[6] = {"I","am","an","array","of","strings"};

char *buf = "["; // open bracket
for (i=0;i<6;i++) {
    // Dynamically build and allocate memory
    asprintf(&buf,"%s%s",buf,strs[i]);
    if(i!=5) { // Add a comma , after each but skip the last
        asprintf(&buf,"%s,",buf);
    }
}
asprintf(&buf,"%s]",buf); // closing backet
printf("\"%s\"\n",buf);

La sortie est

//Simple string builder:
"[I,am,an,array,of,strings]"

so char *buf est développé dynamiquement par asprintf et construit en se formatant lui-même dans l'instruction asprintf.

0
frmdstryr