[ Foro de C ]
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.
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.
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.
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".
(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.)