2011-02-03 8 views
13

Estoy trabajando en un juego de blackjack básico que usa conectores, cortesía de mi clase de sistemas operativos. Nos dieron una interfaz de socket que ya pasa una serie de caracteres hacia adelante y hacia atrás.Construyendo cadenas a partir de las variables en C

tuve esperaban que podía hacer algo como esto:

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

Sin embargo, buscando en Google me llevó a determinar que el valor de retorno de printf es un entero del número de la producción del carbón de leña, no a char [] de los personajes en sí (como esperaba).

¿Hay alguna otra función C que me permita crear cadenas a partir de mis variables?

Respuesta

23

printf escribe en la salida estándar. snprintf logra lo que está buscando aquí. La cadena interpolada se almacena en 'buffer' después de la llamada a snprintf. Es posible que desee definir el tamaño de su búfer un poco más inteligente, pero esto es solo un ejemplo.

char buffer[1024]; 
snprintf(buffer, sizeof(buffer), "Dealer's Card is %C %C", char1, char2); 
+0

No, mira el ejemplo. El buffer será modificado en su lugar. Muchas funciones en C devuelven códigos de error y modifican sus argumentos en su lugar. Tendrá que acostumbrarse a este código de escritura en C. –

+0

Sí. Miopía por mi parte. Releí tus respuestas momentos después de escribir ese comentario. –

+1

@EdS .: ¿Cómo se agrega a 'buffer'. Digamos que quiero invocar 'snprintf' en' buffer' varias veces, pero no quiero sobrescribir el texto dentro de 'buffer'. – arunmoezhi

8

Glibc (y varias otras bibliotecas de C) tienen una función de conveniencia asprintf.

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

Esto es más útil cuando usted no tiene una buena predicción de antemano por la cantidad de memoria que se requiere para mantener la cadena. (Si lo hace, snprintf tiene menos gastos generales, ya que no asigna dinámicamente la memoria.)

En los sistemas sin asprintf, pero con una compatible con los estándares snprintf, que pueden ser implementadas por dos llamadas a snprintf - primero sin búfer y tamaño cero para determinar la longitud de la cadena, una intervención malloc, y luego una segunda vez usando ese espacio recién asignado.

0

Si desea un generador de cadenas en c que asigna dinámicamente la memoria, encontré http://linux.die.net/man/3/vasprintf para ser útil.

Ejemplo:

#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 salida es

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

así char *buf dinámicamente está siendo expandido en asprintf y está construyendo mediante el formateo de sí mismo en la declaración asprintf.

+0

Simplemente preste atención al hecho de que 'asprintf' es una extensión de GNU, y no un método de facto C/POSIX. –

Cuestiones relacionadas