La fonction C suivante:
#include <stdio.h>
int main ()
{
char buffer [13];
int n, a=5, b=3;
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a %d char long string\n",buffer,n);
return 0;
}
5 Réponses :
Ce que vous voulez est l'une de ces deux fonctions: p>
snapintf code> ( http://libslack.org /manpages/snprintf.3.html ). Il prend la longueur du tampon de sortie comme deuxième argument, et si le tampon est trop petit pour le résultat, le nombre de caractères est nécessaire, ce qui vous permettra de réaffecter un tampon plus grand. P>
li>
asprintf code>. Il faut un argument Char ** code> et alloue suffisamment de mémoire pour maintenir la sortie, tant que la mémoire virtuelle extrêmement contiguë est disponible. Vous devez appeler gratuit code> pour la supprimer de la mémoire si vous l'avez terminé avant la sortie du programme et peut avoir besoin de la mémoire pour autre chose. P>
li>
ul>
rock On! Je vais devoir vérifier cela
Tout d'abord, utilisez snprintf code> au lieu de sprintf code>. SNPRINTF CODE> prend un argument supplémentaire qui est le nombre maximal d'octets à écrire (y compris la trailing '\ 0' code>). SNPRINTF code> renvoie ensuite le nombre d'octets écrits, sans inclure le suivi '\ 0' code>. Vous pouvez donc allouer un tampon que vous pense em> sera assez grand et essayez l'appel. S'il touche la fin du tampon, libérez-vous la mémoire tampon et faites une nouvelle, plus grande et réessayez. Rincer et répéter. P>
Vous pouvez utiliser
Danger sera robinson! Asprintf est une extension GNU et ne fait pas partie de c ou de posix
La plupart des gens vous diront d'utiliser Ce conseil est OK. Habituel « design pattern » est de déclarer un tampon temporaire de taille fixe qui est plus grande que la chaîne est toujours susceptible d'être et Il y a une autre façon. P>
C99 précise que si le tampon est NULL, aucun octets sont écrits, mais la longueur réelle qui aurait été écrit est retourné. Cela vous permet de faire un premier passage factice, malloc () un tampon, puis De toute façon, je ne suis pas sûr que je comptais sur tout cela, si mon programme devait fonctionner sur tous les OS jamais fait dans le passé, mais il est un motif raisonnable pour la plupart des gens à utiliser ces jours-ci. P> snprintf () code> car il ne sera pas envahi la fin de votre tampon. P>
snprintf () code> pour cela. Si les besoins de chaîne à enregistrer pendant un certain temps, vous pouvez alors mesurer sa longueur, malloc (3) code> autre, et strcpy (3) code> le tampon temporaire au semi-permanent malloc () code> tampon. p>
Une approche en deux passes h3>
snprintf () code> pour ce tampon. (En théorie, vous pouvez utiliser simplement sprintf () code>, la longueur est maintenant connue, mais je ne.) P>
Je l'ai jeté ensemble comme un exercice pour moi basé sur la suggestion de DigitalRoss. N'hésitez pas à fusionner cela avec sa réponse si vous avez le représentant (je ne le fais pas).
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* createRandstr(void);
int main(void)
{
char* mystr;
char* randomString;
size_t len;
/* Makes a random string of A's */
randomString = createRandstr();
/* 1st pass gets needed size */
len = (size_t)snprintf(NULL, 0, "random string -->%s<--\n", randomString);
mystr = malloc(len);
/* Safely write to mystr with known length 'len' */
snprintf(mystr, len, "random string -->%s<--\n", randomString);
puts(mystr);
free(mystr);
free(randomString);
return 0;
}
char* createRandstr(void)
{
char* randstr;
size_t randlen;
unsigned int i;
srand((unsigned int)time((time_t*)NULL)); /* Seed rand() */
randlen = (size_t)rand() % 50; /* Limit to max of 49 chars */
randstr = malloc(randlen);
for (i=0; i < randlen; i++)
{
randstr[i] = 'A';
}
randstr[randlen - 1] = '\0';
return randstr;
}
Vous devez conserver len code> en tant que int code> et ajoutez un chèque que len> = 0 code>
En outre, vous avez besoin d'un tampon de len + 1 code>
@Chals: Est-ce que certains devoirs?
@RageZ: Non, ce n'est pas. Je suis juste un débutant essayant d'apprendre certains C dans son temps libre.
@RAGEZ. hahaha