2009-11-20 26 views
5

Normalmente se puede imprimir una cadena en C como esto ..una cadena en C

printf("No record with name %s found\n", inputString); 

Pero yo quería hacer una cadena fuera de él, ¿cómo puedo hacerlo? Busco algo como esto ..

char *str = ("No record with name %s found\n", inputString); 

espero que sea claro lo que estoy buscando ...

+3

Hágase un favor y ir a comprar "El Lenguaje de Programación C" por Kernigham y Ritchie. – Pete

+1

Gracias Pete, lo haré. – itsaboutcode

+0

http://www.eskimo.com/~scs/cclass/cclass.html –

Respuesta

31

Una opción sería utilizar sprintf, que funciona igual que printf pero toma como primer parámetro es un puntero al búfer al que debe colocar la cadena resultante.

Es preferible utilizar snprintf, que toma un parámetro adicional que contiene la longitud del búfer para evitar sobrepasamientos de búfer. Por ejemplo:

char buffer[1024]; 
snprintf(buffer, 1024, "No record with name %s found\n", inputString); 
3

Mira en sprintf (véase más adelante).

int n = sprintf(str, "No record with name %s found\n", inputString); 
3

Uso

sprintf(str, "No record with name %s found\n", inputString); 
10

Usted está buscando el sprintf familia de funciones. Su formato general es:

char output[80]; 
sprintf(output, "No record with name %s found\n", inputString); 

Sin embargo, sprintf por sí mismo es extremadamente peligroso. Es propenso a algo llamado desbordamientos de búfer. Lo que esto significa es que sprintf no tiene idea de qué tan grande es la cadena output que le proporcionó, por lo que voluntariamente le escribirá más datos de los disponibles. Por ejemplo, esto va a compilar limpiamente, pero se sobreponen a memoria válida — y no hay manera de dejar sprintf sabe que está haciendo algo mal:

char output[10]; 
sprintf(output, "%s", "This string is too long"); 

La solución es utilizar una función como snprintf, que tiene una longitud parámetro:

char output[10]; 
snprintf(output, sizeof output, "%s", "This string is too long, but will be truncated"); 

o, si estás en un sistema Windows, utilizar las variantes _sntprintf y amigos, que protegen contra desbordamiento de cualquiera de las cadenas de entrada o de salida.

+3

Como es una pregunta de tarea, me gustaría señalar que 'tamaño de salida' solo da la cantidad de * elementos * en un' char 'array - la práctica habitual es utilizar:' sizeof array/sizeof array [0] ', que funciona sin depender del tamaño de varios tipos. Además, también funciona para matrices 'char'. :) –

+0

Buen punto. Incluso eso, sin embargo, puede fallar en algunos casos muy comunes, como pasar 'array' a una función, en cuyo punto,' sizeof array' es 4 u 8 en cualquier sistema moderno, independientemente del número y tamaño de los elementos. en esto.La verdadera solución es usar 'std :: vector' o algo similar y evitar todo el lío por completo. –

7

Dado que esto es una tarea (gracias por etiquetarlo como tal), le sugiero que observe de cerca la familia de funciones ...printf().

estoy seguro de que encontrará la solución :)

+3

Bueno, parece que otros ya le privaron del placer de descubrir :) –

+1

+1 de todos modos por dar el tipo correcto de respuesta a una pregunta de tarea. –