Pregunta sobre sscanf(); ??? (RESUELTO)

Iniciado por ralymontes, 13 Noviembre 2011, 01:30 AM

0 Miembros y 1 Visitante están viendo este tema.

ralymontes

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<ctype.h>
char id;
int n,i;

int main()
{
char cadena[100];
printf("Inserta n:\n");
scanf("%d",&n);
   for(i=0;i<n;i++)
   {
   sscanf("Inserta identificador (e, v, l, c):\n","%c",&id);
   sscanf("Inserta cadena a tratar:\n","%s",cadena);
   }
return 0;
}


Por que cuando el programa se ejecuta paraciera que no entra al for, es decir, se sale completamente. :/

Tambien intente poner dentro del ciclo el clásico printf() y el scanf(), pero tengo muchos problemas con los buffer ( tambien se salta las lineas) y fflush(stdin) no me dio buenos resultados. Cómo soluciono esto?

Gracias  y Saludos, Raly.

rir3760

Los problemas aquí son dos: estas utilizando sscanf, ella lo que hace es procesar la cadena pasada como primer argumento y por supuesto no se va a imprimir en la salida estándar.

El segundo se debe al uso de "%c" ya que al utilizar ese especificador la función no ignora (como en otros casos) el espacio blanco, en su lugar se "traga" el primer carácter que encuentre y este es usualmente un avance de linea.

Por ultimo no deberías utilizar "fflush(stdin)", el porque se explica en el tema |Lo que no hay que hacer en C/C++. Nivel básico|.

Para que funcione correctamente debes cambiarlo a:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char palabra[100];
    char id;
    int n;
    int i;
   
    printf("Inserta n: ");
    fflush(stdout);
    if (scanf("%d", &n) != 1 || n < 0)
        return EXIT_FAILURE;
   
    for (i = 0; i < n; i++){
        printf("Inserta identificador (e, v, l, c): ");
        fflush(stdout);
        scanf(" %c", &id);
       
        printf("Inserta PALABRA a tratar: ");
        fflush(stdout);
        scanf("%s", palabra);
       
        printf("Id: %c\n", id);
        printf("Palabra: %s\n\n", palabra);
    }
   
    return EXIT_SUCCESS;
}


El espacio en " %c" es critico para descartar el espacio blanco antes del carácter.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

ralymontes

Hola:

Muchas gracias por responder, pero tengo un problema y que quiza no lo dije antes, sucede que  "palabra" es una cadena con espacios, es ahí donde tambien falla lo que has puesto, no sé exactamente que pasa, pero cuando meto una cadena con espacios de nuevo se salta lineas. :/

Me han dicho que una solucion es obtener caracter por caracter de la entrada estandar.

Saludos y mil gracias!

satu

Hola


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char palabra[100];
    char id;
    int n;
    int i;

    printf("Inserta n: ");
    if (scanf("%d", &n) != 1 || n < 0)
        return EXIT_FAILURE;
    while(getchar() != '\n') ;

    for (i = 0; i < n; i++)
        {
        printf("Inserta identificador (e, v, l, c): ");
        scanf(" %c", &id);
        while(getchar() != '\n') ;

        printf("Inserta PALABRA a tratar: ");
        fgets(palabra, 99, stdin);

        printf("Id: %c\n", id);
        printf("Palabra: %s\n\n", palabra);
        }

    return EXIT_SUCCESS;
}


Saludos
Breakbeat como forma de vida

ralymontes

Ahmmm Muchas gracias, esto me estaba comiendo mucho tiempo, pues estoy tratando de hacer un analizador sintactico... pero no podia con esto.

Gracias, Saludos, Raly.