/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Dudas con scanf("%*[^\n]") y *scanf("%*c"

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
cigoba



Registrado: 27 Ago 2007
Mensajes: 39

MensajePublicado: 14/09/2007 7:49 am
Título: Dudas con scanf("%*[^\n]") y *scanf("%*c"

Hola
Alguien podría explicarme qué función cumplen estas dos instrucciones
scanf("%*[^\n]") y scanf("%*c") juntas y separadas?. Creo que se relacionan con la limpieza del buffer de entrada reemplazándola por el fflush(stdin) que sé que no debe usarse porque no forma parte del estándar de C, es solo una extensión que implementan algunos compiladores.
Al código siguiente lo saqué de una página
Código:

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

int main(void)
{
    char car1, car2;
    printf("caracter 1: ");
    scanf("%c", &car1);
    scanf("%*[^\n]");
    scanf("%*c");
    printf ("caracter 2: ");
    scanf ("%c", &car2);
    system("PAUSE");
    return 0;
}


Si saco scanf("%*[^\n]") el programa funciona bien igual. O sea, no entiendo muy bien el uso de estas instrucciones juntas si una de ellas puede eliminarse.

Existe alguna otra forma de reemplazar estas dos instrucciones por alguna otra cosa para hacerlo al código, no sé, más seguro o efectivo?

Gracias Shocked
_________________
esta es mi firma.
Volver arriba
digies



Registrado: 18 Nov 2005
Mensajes: 241
Ubicación: Cono Sur

MensajePublicado: 14/09/2007 3:24 pm
Título:

Hola

Si no me equivoco, el formato “%* [^ \ n]” dentro del scanf() es leer cualquier carácter mientras no sea nueva línea "\n".

También puedes hacerlo así:

Código:

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

int main(void)
{
    char car1, car2;
    printf("caracter 1: ");
    scanf("%c", &car1);
    scanf("%*[^\n]");
    getchar(); /* reemplaza a scanf("%*c"); */
    printf ("caracter 2: ");
    scanf ("%c", &car2);
    system("PAUSE");
    return 0;
}

Ojo al ojo: No es lo mismo esto:
Código:

...
scanf ("%* [^ \ n]");
scanf ("%*c");
...

que esto
Código:

...
scanf ("%* [^ \ n] %*c");
...

Esta última forma no es correcta.

Y esta sería otra alternativa, que para mí es la mejor:
Código:

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

int main(void)
{
    char car1, car2;
    int ch;
    printf("caracter 1: ");
    scanf("%c", &car1);
    while((ch=fgetc(stdin))!=EOF && ch!='\n')
       ;
    printf ("caracter 2: ");
    scanf ("%c", &car2);
    system("PAUSE");
    return 0;
}


Un saludo
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1372
Ubicación: En ecx esperando un call

MensajePublicado: 14/09/2007 5:39 pm
Título:

La mejor alternativa (si esto es posible) es no usar scanf.

S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 16/09/2007 8:09 am
Título:

Una recomendacion usual es el uso de fgets + sscanf/strtok/etc. o el uso de funciones propias.

Una caracteristica muy util de scanf/fscanf es la actualizacion del indicador de posicion (en el stream) algo que (tomando en cuenta las diferencias) no esta implementado en sscanf, seria muy util que esta ultima nos indicara la posicion del ultimo caracter procesado (similar a las funciones strtol/strtod).

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com