¡Hola! Jeje, creo que ya sé en qué PDF la has visto: en el manual de "Programación de Videojuegos con SDL" de A.G. Serrano, ¿me equivoco?. Yo también seguí ese manual y debo decirte que es muy bueno. Al grano: la función sprintf(); . Primero te cito lo que viene en una relación de librerías estándar de C/C++ de la página c.conclase.net (es realmente buena si quieres aprender todo sobre C++) y luego te lo explico más coloquial:
int sprintf(char *cadena, const char *formato, ...);
Esta función es equivalente a fprintf, excepto que el argumento cadena especifica un array en el
cual la salida generada es para ser escrita, en vez de un stream. Un carácter nulo es escrito al final
de los caracteres escritos; no es contado como parte de la suma retornada. El comportamiento
acerca de copiando entre objetos que se superponen no está definido.
Valor de retorno:
La función sprintf retorna el número de caracteres escritos al array, sin contar el carácter nulo al
final.
Menudo rollazo, ¿no? Ahora te lo explico a mi modo. Es muy simple, la función tiene dos argumentos básicos: el primero, que es una cadena de caracteres sobre la que se escribirá y el segundo, que es la cadena de caracteres a escribir sobre la primera. Es decir, que si tú pones:
- Código: Seleccionar todo
char auxiliar[64];
char inicial[16] = "Hola mundo!";
sprintf(auxiliar, inicial);
O en su defecto pones:
- Código: Seleccionar todo
char auxiliar[64];
sprintf(auxiliar, "Hola mundo!");
En ambos casos acabarás con una cadena "auxiliar" que tendrá en su interior la frase "Hola mundo!". Es decir, que se copia lo que haya en el segundo argumento de la función al primero. Ahora bien, como verás en el prototipo, el número de argumentos es indefinido, puedes pasar los que tú quieras. ¿Para qué sirve eso? Pues imagínate que quieres cargar imágenes que tienen nombres iguales, tan sólo varía un nº para indicar que imagen es (tile1.bmp, tile2.bmp, tile3.bmp...). Pues en vez de ir poniendo esas cadenas a mano puedes, mediante sprintf hacerlo automático. Te pongo un ejemplo y luego lo comento:
- Código: Seleccionar todo
char auxiliar[64];
SDL_Surface* img[8];
for(int k = 0; k < 8; k++)
{
sprintf(auxiliar, "tile%d.bmp", k);
img[k] = SDL_LoadBMP(auxiliar);
}
Con éste código cargarías 8 imágenes en un array de superficies (lo siento si he puesto alguna aberración, estoy escribiendo a toda prisa). ¿Pero qué es ek "%d" que he puesto en la cadena del segundo argumento? Pues eso significa que después va a haber un tercer argumento de tipo int que la función debe colocar en el lugar de la cadena que se encuentra "%d". En tu caso, en lugar de %d pone "%s", esto significa que el argumento será una cadena de caracteres. Había más combinaciones de %+caracter, pero no las recuerdo porque casi no las uso... Con lo cual el comportamiento de: tu código viene a ser copiar dentro de "msg" lo que hay dentro de la cadena "texto". Por supuesto, puedes combinar varias opciones de las que te dije de esta forma:
- Código: Seleccionar todo
sprintf(auxiliar, "Hola %s, tienes %d anos", nombre, edad);
Si suponemos que la cadena nombre es "Pepe" y que la variable int edad vale 28, pues la cadena auxiliar contendría algo así como:
Hola Pepe, tienes 28 anos
Espero que lo hayas entendido. Si he dicho algo mal, por favor, corregidme. No soy muy experto en estas cosas.
Un saludo.