[ Foro de C ]

Diferencia entre sprintf y strcpy...

10-Sep-2009 17:38
Aitor Ugarte
4 Respuestas

Hola a tod@s,estoy siguiendo el curso de C de Nacho Cabanes e intentando resolver el ejercicio de la página 83 del PDF me surgió una duda ya que veo que en él es posible en teoria usar ambas funciones,o tal vez no??creo que para que el programa vaya almacenando en una cadena los nombres introducidos ambas son válidas.
Por otra parte para crear la variable que almacene el espacio disponible para los 100 nombres de 80 caracteres cada uno estoy declarandolo como.....char nombres[100][80].Es esto correcto?lo digo porque me sale a menudo este error al compilar ..Compiling NONAME00.CPP:
Error NONAME00.CPP 10: Cannot convert 'char[80] *' to 'char *'Aunque tal vez sea por algun otro error ya que todavia no he conseguido realizar el ejercicio.confuso
Despues de un sprintf hay que usar un sscanf necesariamente?es que no me queda claro su uso en el curso,tal vez si alguien me puede poner algun ejemplo mas.....
Gracias.



11-Sep-2009 01:23
Nacho Cabanes (+83)

En primer lugar, ¿de qué versión del PDF hablas? Supongo que será la 0.23, que es la última que está "a disposición de todo el mundo", y que, efectivamente, tiene ejercicios propuestos sobre cadenas en la página 83. Pronto espero tener publicada otra versión, con algunas cosas más explicadas y algún ejemplo más.

En cuanto a la diferencia entre strcpy y sptrinf:

- strcpy copia una cadena en otra, tal cual, sin cambiar nada en ella.

- sprintf "crea" una cadena a partir de un código de formato que tú le indicas, y, quizá, de varios datos opcionales.

Por tanto, puedes "imitar" un strcpy usando el formato más simple posible de sprintf, pero no al revés. Y de hecho, si sólo quieres copiar una cadena en otra, no tiene sentido usar sprintf, porque strcpy es mucho más rápido (y sencillo) para eso.


En segundo lugar, si te dice que no puede convertir un char[80] en un char, es porque estás usando strcpy, strcmp o alguna orden similar, que debería recibir dos cadenas, y en vez de uso, uno de los parámetros que tú le indicas es un carácter, como en estos ejemplos:

char respuesta[80];
char letra;
char variasRespuestas[100][80];

strcpy(respuesta, letra); /* incorrecto */
strcpy(respuesta, variasRespuestas[0][2]);  /* incorrecto */

Lo correcto sería algo como

strcpy(respuesta, variasRespuestas[3]);

(la próxima vez, pon un fragmento del fuente para ver dónde está el problema).


Finalmente: después de un sprintf no tiene por qué haber un sscanf. sprintf crea una cadena a partir de varios datos, y sscanf extrae información de una cadena.  ¿Siempre que crees una cadena tendrás que extraer información de otra cadena? Lo habitual es que no. Es un caso muy distinto al de "printf" y "scanf", porque cuando pides algo al usuario normalmente tendrás que avisarle de lo que esperas obtener.


11-Sep-2009 20:57
Aitor Ugarte

Habia probado varios codigos,con ideas totalmente diferentes por lo que decidi no poner ninguno,mas o menos esto es lo que tengo en mente....

#include<stdio.h>
#include<string.h>
main() {
char nombres[100][80];//1ª cadena//
char nombres1[10];//2ª cadena//

 do{
printf("introduce un nombre ");
gets(nombres1);
strcpy(nombres,nombres1[10]);
while(nombres1!=" ");//este while no se si es posible usarlo asi//

puts(nombres);
}

En el programa se pide que se detenga e imprima los nombres introducidos al pulsar intro,no se cómo se hace eso...introduje en el while =" " estas dos comills aunque imagino que eso solo simula un espacio.

Gracias.


12-Sep-2009 17:24
Nacho Cabanes (+83)

Un par de correcciones.

- Primero, el comentario poco importante:

char nombres[100][80];//1ª cadena//

(eso no es una cadena, sino un "array" de cadenas).

- Primera corrección:

strcpy(nombres,nombres1[10]);

Esa orden es incorrecta: copias un array de 100 cadenas ("nombres") en la letra 11 de una cadena ("nombres1[10]").

Debería ser algo como

strcpy(nombres1,nombres[i]);

donde i sería un contador que iría aumentando desde 0 hasta 99, para guardar en cada una de las posiciones del array.

Aun así, cambia los nombres de la variables para que sean más claros: en vez de "nombres" llámalo "respuestasAnteriores", y en vez de "nombres1", llámalo "respuestaActual" o algo así.

- Segunda correción:

while(nombres1!=" ");

Efectivamente, no puede ser así. En primer lugar, debes comparar con "" (cadena vacía), no con " " (cadena formada por un espacio). En segundo lugar, NUNCA debes comparar cadenas con == o con !=, sino usando "strcmp".


12-Sep-2009 22:57
Aitor Ugarte

wow!no me ha quedado a salvo ni una linea de código.Muchas gracias por la ayuda,me he quedado atascado en este ejercicio pero seguiré intentándolo,aunque creo que lo mejor es no seguir estudiando mas lecciones y empezar otra vez desde el principio :-)






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)