[ Foro de C ]

gets+sscanf

21-Jan-2015 01:13
Invitado (fragodos)
3 Respuestas

Buenas tardes,
Ante todo, agradecer el esfuerzo realizado para que de forma gratuita podamos acceder a aprender a programar.
Acabo de empezar con el lenguaje C y estoy haciendo el ejercicio de la página 107 y, además de cometer errores cada dos por tres, estoy enganchado con esto que no consigo encontrar qué hago mal.
Utilizo un mac con el Xcode y estoy empezando con el programa, se me para en los gets+sscanf


# include <stdio.h>

struct
{
    char artista;
    char titulo;
    int duracion;
} cancion[100];

int opcion;
int contadorCancion=0;

char textoTemporal;

int main ()
{
    
    printf("MENÚ DE ITUNES:\n");
    printf("1. AÑADIR UNA CANCIÓN.\n");
    printf("2. LISTAR CANCIONES GUARDADAS.\n");
    printf("3. BUSCAR CANCIÓN.\n");
    
    gets(textoTemporal);
    sscanf(textoTemporal, "%d", &opcion);
    
    switch (opcion)
    {
        case 1:
            printf("Introduce el artista...: ");
            gets(cancion[contadorCancion].artista);
            printf("Introduce el título...: ");
            gets(cancion[contadorCancion].titulo);
            printf("Introduce la duración...: ");
            gets(textoTemporal);
            sscanf(textoTemporal, "%d", &cancion[contadorCancion].duracion);

         
Mil gracias por la ayuda....
Un saludo,
Javier.


21-Jan-2015 16:51
Nacho Cabanes (+84)

Esa página 107... ¿de qué curso y qué versión?  ;-)

Las últimas versiones de C marcan "gets" como orden anticuada que debe ser evitada, pero en la versión más reciente del curso (del mío, vamos ;-D ) pone cómo esquivarla.


22-Jan-2015 00:28
Invitado (fragodos)

es del texto "Fundamentos de programación en C" (Revisión actual: 0.95)...


23-Jan-2015 11:15
Nacho Cabanes (+84)

Entonces estás en el curso que debes ;-) pero no has llegado a la página que necesitas si usas un compilador muy reciente (intuyo que el que accedes desde tu versión de XCode lo es).

Mira la página 129, apartado "6.14. Evitar los problemas de gets"

Te incluyo aquí el principio de ese apartado:

Como comentamos en el tema 5, el uso de "gets" está desaconsejado a partir del estándar C99 (de 1999), por tratarse de una orden poco segura, pero esta orden ni siquiera existirá en los compiladores que sigan el estándar C11 (de diciembre de 2011). Una alternativa, en compiladores modernos, es usar "get_s" que recibe como segundo parámetro el tamaño máximo del texto. Otra alternativa, más segura que gets, que permite que la cadena contenga espacios, y que funcionará en cualquier compilador de C, es usar "fgets".

"fgets" espera 3 parámetros: la variable en la que se guardará el texto, la anchura máxima y el fichero desde el que leer. El "truco" para usar "fgets" para leer de teclado es indicar "stdin" (standard in, entrada estándar) como nombre que fichero, que es un identificador predefinido en el sistema:


fgets(nombre, 20, stdin);


Eso sí, "fgets" tiene un problema para este uso: conserva el avance de línea (\n). Por eso, habrá que eliminarlo "a mano" (...)






(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.)