| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
cigoba

Registrado: 27 Ago 2007 Mensajes: 39
| Publicado: 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  _________________ esta es mi firma. |
|
| Volver arriba | |
 |
digies
Registrado: 18 Nov 2005 Mensajes: 241 Ubicación: Cono Sur
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |
 |
|
|