| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
pedroqv
Registrado: 24 Ago 2007 Mensajes: 5
| Publicado: 24/08/2007 8:03 pm | | | Título: No captura bien |
| Tengo este codigo para capturar en 3 variables y formar una oracion el problema es que al capturar verbo se lo brinca (hay veces que si me lo pide) cual seria mi error:
| Código: | char sujeto[15], verbo[16], predicado[20]; printf("Captura el sujeto: "); scanf("%s",&sujeto); printf("Captura el verbo: "); scanf("%s",&verbo); printf("Captura el predicado: "); scanf("%s",&predicado); printf("Oracion: %s %s %s\n\n", sujeto, verbo, predicado); |
|
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 24/08/2007 9:12 pm | | | Título: |
| Lo primero que debes hacer es eliminar (en las tres llamadas a scanf) al operador "direccion de" (el '&') ya que al ser arrays este operador no es necesario.
El problema con la funcion scanf cuando se utiliza el indicador de tipo "%s" es que esta no lee una linea de texto completa sino una palabra, esto es, una secuencia de caracteres que no contiene espacio blanco (los caracteres tab, espacio, avance de linea, etc.).
Si en el programa el sujeto o cualquiera de las otra cadenas esta compuesta por una sola palabra (por ejemplo "perro") no hay problema pero si son varias (por ejemplo "perro negro y callejero") entonces la primera palabra se almacena en "sujeto", la segunda en "verbo" y la tercera en "predicado".
Para evitar esto lo mas sencillo es de plano no utilizar scanf, en su lugar utiliza fgets:
| Código: | char sujeto[15]; char verbo[16]; char predicado[20]; char *aux;
/* ... */
printf("Captura el sujeto: "); fflush(stdout); if (fgets(sujeto, sizeof sujeto, stdin) == NULL){ /* manejo de error */ } if ((aux = strchr(sujeto, '\n')) != NULL) *aux = '\0';
printf("Captura el verbo: "); fflush(stdout); if (fgets(verbo, sizeof verbo, stdin) == NULL){ /* manejo de error */ } if ((aux = strchr(verbo, '\n')) != NULL) *aux = '\0';
printf("Captura el predicado: "); fflush(stdout); if (fgets(predicado, sizeof predicado, stdin) == NULL){ /* manejo de error */ } if ((aux = strchr(predicado, '\n')) != NULL) *aux = '\0';
printf("Oracion: %s %s %s\n\n", sujeto, verbo, predicado); |
Ya que esta operacion es repetitiva el codigo se puede reducir colocando las operaciones de peticion y procesamiento de linea en una funcion:
| Código: | /* aqui van los headers incluyendo string.h*/
char *obtener_linea(char const *prompt, char *dst, size_t tam);
/* ... */
char sujeto[15]; char verbo[16]; char predicado[20];
/* ... */
obtener_linea("Captura el sujeto: ", sujeto, sizeof sujeto); obtener_linea("Captura el verbo: ", verbo, sizeof verbo); obtener_linea("Captura el predicado: ", predicado, sizeof predicado);
printf("Oracion: %s %s %s\n\n", sujeto, verbo, predicado);
/* ... */
char *obtener_linea(char const *prompt, char *dst, size_t tam) { char *ret_val; char *aux; printf("%s", prompt); fflush(stdout); if ((ret_val = fgets(dst, tam, stdin)) == NULL){ /* manejo de error */ }else if ((aux = strchr(dst, '\n')) != NULL) *aux = '\0'; return ret_val; } |
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 | |  | pedroqv
Registrado: 24 Ago 2007 Mensajes: 5
| Publicado: 25/08/2007 5:54 pm | | | Título: |
| | Ok me quedo claro lo del uso del scanf, lo otro nada mas le di una pasada por que me dio flojera pss se mira que es un poco batalloso capturar del teclado |
| | Volver arriba | |  | | 4DIMENSION

Registrado: 13 Jun 2004 Mensajes: 198
| Publicado: 27/08/2007 4:25 am | | | Título: ideas |
| | pedroqv escribió: | | Ok me quedo claro lo del uso del scanf, lo otro nada mas le di una pasada por que me dio flojera pss se mira que es un poco batalloso capturar del teclado | Puedes usar scanf, pero de forma ligéramente diferente, para que coja espacios, antes vacía el búfer con fflush(stdin):
fflush(stdin); scanf(" %[^\n]",&a);
Otro consejo, es que uses unas cadenas más grandes (para que nunca se llenen), ya que los ordenadores actuales, tienen la tira de RAM, y para un programa pequeño, no merece la pena complicarse:
char sujeto[150], verbo[100], predicado[200]; _________________ [img=http://barrapunto.com/pollBooth.pl?section=&qid=350&aid=2] |
| | Volver arriba | |  | cheroky
Registrado: 22 Sep 2005 Mensajes: 1372 Ubicación: En ecx esperando un call
| Publicado: 27/08/2007 5:17 am | | | Título: |
| | 4DIMENSION escribió: | | Puedes usar scanf, pero de forma ligéramente diferente, para que coja espacios, antes vacía el búfer con fflush(stdin): |
No quiereo ser pedante pero fflush no esta definido para streams de la entrada estandar, en cambio se puede "leer" de esta para eliminar posibles saltos de linea indeseables.
| pedroqv escribió: | | Código: | scanf("%s",&sujeto); |
|
Si bien usar el operador de direccion con scanf sobre arrays automaticos es funcional no es correcto, si cambiaramos los buffers por memoria de asigancion dinamica el programa reventaria.
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 | |  | 4DIMENSION

Registrado: 13 Jun 2004 Mensajes: 198
| Publicado: 27/08/2007 1:46 pm | | | Título: programación |
| | cheroky escribió: | | 4DIMENSION escribió: | | Puedes usar scanf, pero de forma ligéramente diferente, para que coja espacios, antes vacía el búfer con fflush(stdin): |
No quiereo ser pedante pero fflush no esta definido para streams de la entrada estandar, en cambio se puede "leer" de esta para eliminar posibles saltos de linea indeseables.
S2. | Si, y creo que los ******** de los profesores de informática, eliminaron esa intrucción tal vez con esa escusa, y era más difícil hacer la práctica. No tendría nada que objetar, si no fuera porque estaba ayudando a un alumno de mecánica, donde se supone que no es necesario programar de una forma tan exigente, de hecho la asignatura se da en primero (y se llama fundamentos), y no se vuelve a ver.
Menos mal, que cuando estuve yo, nos permitieron esa instrucción, es más, sólo nos enseñaron el scanf y el printf por sencillez, aunque tal vez para cadenas, hubiera sido más sencillo en gets que aprendí luego por mi cuenta. _________________ [img=http://barrapunto.com/pollBooth.pl?section=&qid=350&aid=2] |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 27/08/2007 5:16 pm | | | Título: Re: programación |
| | 4DIMENSION escribió: | | cheroky escribió: | | No quiero ser pedante pero fflush no esta definido para streams de la entrada estandar |
Si, y creo que los ******** de los profesores de informática, eliminaron esa intrucción tal vez con esa escusa, y era más difícil hacer la práctica. |
No veo porque ya que basta con un simple bucle:
| Código: | while ((ch = getchar()) != EOF && ch != '\n') ; |
Para descartar el resto de la linea.
| 4DIMENSION escribió: | | No tendría nada que objetar, si no fuera porque estaba ayudando a un alumno de mecánica, donde se supone que no es necesario programar de una forma tan exigente, de hecho la asignatura se da en primero (y se llama fundamentos), y no se vuelve a ver. |
El "problema" con C es que este se encuentra disponible en mas que un puñado de plataformas, debido a esto es muy importante conocer y separar lo garantizado (C estandar) de lo dependiente de una implementacion (extensiones), casi puedo asegurarte que si a ese amigo le preguntas si fflush(stdin) es parte de C o una cortesia del compilador no te sabe responder ...
... el siguiente paso es imaginarnos que pasa cuando se tiene esta "laguna" y una extension no soportada se utiliza, basta con buscar utilizando Google (de preferencia en Google Groups o directamente en USENET) terminos como:
linux fflush stdin
Para darnos una idea del resultado.
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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |