Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ralymontes en 13 Noviembre 2011, 01:30 am



Título: Pregunta sobre sscanf(); ??? (RESUELTO)
Publicado por: ralymontes en 13 Noviembre 2011, 01:30 am
Código:
#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.


Título: Re: Pregunta sobre sscanf(); ???
Publicado por: rir3760 en 13 Noviembre 2011, 02:00 am
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| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

Para que funcione correctamente debes cambiarlo a:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.    char palabra[100];
  7.    char id;
  8.    int n;
  9.    int i;
  10.  
  11.    printf("Inserta n: ");
  12.    fflush(stdout);
  13.    if (scanf("%d", &n) != 1 || n < 0)
  14.        return EXIT_FAILURE;
  15.  
  16.    for (i = 0; i < n; i++){
  17.        printf("Inserta identificador (e, v, l, c): ");
  18.        fflush(stdout);
  19.        scanf(" %c", &id);
  20.  
  21.        printf("Inserta PALABRA a tratar: ");
  22.        fflush(stdout);
  23.        scanf("%s", palabra);
  24.  
  25.        printf("Id: %c\n", id);
  26.        printf("Palabra: %s\n\n", palabra);
  27.    }
  28.  
  29.    return EXIT_SUCCESS;
  30. }

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

Un saludo


Título: Re: Pregunta sobre sscanf(); ???
Publicado por: ralymontes en 13 Noviembre 2011, 07:49 am
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!


Título: Re: Pregunta sobre sscanf(); ???
Publicado por: satu en 13 Noviembre 2011, 10:52 am
Hola

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.    char palabra[100];
  7.    char id;
  8.    int n;
  9.    int i;
  10.  
  11.    printf("Inserta n: ");
  12.    if (scanf("%d", &n) != 1 || n < 0)
  13.        return EXIT_FAILURE;
  14.    while(getchar() != '\n') ;
  15.  
  16.    for (i = 0; i < n; i++)
  17.        {
  18.        printf("Inserta identificador (e, v, l, c): ");
  19.        scanf(" %c", &id);
  20.        while(getchar() != '\n') ;
  21.  
  22.        printf("Inserta PALABRA a tratar: ");
  23.        fgets(palabra, 99, stdin);
  24.  
  25.        printf("Id: %c\n", id);
  26.        printf("Palabra: %s\n\n", palabra);
  27.        }
  28.  
  29.    return EXIT_SUCCESS;
  30. }
  31.  

Saludos


Título: Re: Pregunta sobre sscanf(); ???
Publicado por: ralymontes en 13 Noviembre 2011, 18:42 pm
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.