ayuda con getchar

Iniciado por ometeotl, 10 Octubre 2011, 18:21 PM

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

ometeotl

estoy intentando hacer un programa básico para capturar el caracter, pero siempre me sale el mensaje de "default" y eso que introduzco el caracter correcto para el funcionamiento. El programa esta trabajando en conjunto con un switch y while...
/*Contador de palabras*/
#include <stdio.h>
#include <string.h>
main(){
       char grade;
       int acon=0,bcon=0,ccon=0,dcon=0,fcon=0;
       
       printf("\nIntroduzca la letra de la calificacion");
       printf("\nIntroduzca EOF para finalizar: ");
       
       while((grade=getchar())!=EOF){
                                    switch(grade){
                                                  case 'A' : case 'a':
                                                       ++acon;
                                                       break;
                                                  case 'B' : case 'b':
                                                       ++bcon;
                                                       break;
                                                  case 'C' : case 'c':
                                                       ++ccon;
                                                       break;
                                                  case 'D' : case 'd':
                                                       ++dcon;
                                                       break;
                                                  case 'F' : case 'f':
                                                       ++fcon;
                                                       break;
                                                  default:
                                                          printf("\n\nEntrada invalidad");
                                                          printf("\nIntroduzca letra de una calificacion: ");
                                                          break;
                                                          }
                                                          }
       printf("\nEl total de cada calificacion es:");
       printf("\nA: %d",acon);
       printf("\nB: %d",bcon);
       printf("\nC: %d",ccon);
       printf("\nD: %d",dcon);
       printf("\nF: %d",fcon);
       
       return 0;
       }

dejo una imagen dela ejecución, igual cuando escribo EOF en vez de terminar me marca el mismo error y tres veces


dewolo

http://foro.elhacker.net/programacion_cc/iquestpara_que_sirve_la_funcion_getchar-t200224.0.html

estas escribiendo eof? pone otra cosa algo asi como '\n' osea cuando apretes un salto de linea


ometeotl

Gracias, ya quedo y se resolvio el error, pero ahora cuando escribo otro caracter no sale el mensaje de default, me manda al break instantaneamente

dewolo

#3
plantea las condiciones de salida del while de forma diferente, asi por ejemplo..
Citar

while(1)
{

     grade=getchar();
                                   switch(grade){
                                                 case 'A' : case 'a':
                                                      ++acon;
                                                      break;
                                                 case 'B' : case 'b':
                                                      ++bcon;
                                                      break;
                                                 case 'C' : case 'c':
                                                      ++ccon;
                                                      break;
                                                 case 'D' : case 'd':
                                                      ++dcon;
                                                      break;
                                                 case 'F' : case 'f':
                                                      ++fcon;
                                                      break;
                                                 default:
                                                         printf("\n\nEntrada invalidad");
                                                         printf("\nIntroduzca letra de una calificacion: ");
                                                         break;
                                                         }

              if(grade=='s') break;
}

ometeotl

gracias, pero logre resolverlo, borre el mensaje de entrada invalida, y lo deje en limpio, cuando escribo algo diferente solo me repite el mensaje de introducir letra.
Quedo de esta forma.
while((grade=getchar())!='Z'){
                                   switch(grade){
                                                 case 'A' : case 'a':
                                                      ++acon;
                                                      break;
                                                 case 'B' : case 'b':
                                                      ++bcon;
                                                      break;
                                                 case 'C' : case 'c':
                                                      ++ccon;
                                                      break;
                                                 case 'D' : case 'd':
                                                      ++dcon;
                                                      break;
                                                 case 'F' : case 'f':
                                                      ++fcon;
                                                      break;
                                                 default:
                                                         printf("\nIntroduzca letra de una calificacion: ");
                                                         break;
                                                         }
                                                         }

Muchas gracias por la aclaracion del getchar

rir3760

Los problemas son varios.

Los tecnicos son dos: el primero que debes declarar la variable "grade" con el tipo "int" ya que ese es el valor de retorno de "getchar". Tambien debes tener en cuenta que todos los caracteres seran procesados, por ejemplo si tecleas:
A{ENTER}
El caracter 'A' se contabiliza asi como el caracter '\n' (generado por el {ENTER}) resultara en el mensaje de "entrada no valida".

Otro error es el EOF, no puedes simplemente teclear:
EOF{ENTER}
En su lugar la señal de fin de archivo se genera dependiendo del SO, en una linea en blanco debes utilizar la combinacion de teclas {CONTROL} + 'Z' (MS Windows) o {CONTROL} + 'd' (Linux + Bash).

Un programa sencillo para practicar:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int ch;
   
   
   while (1){
      printf("Teclea un caracter: ");
      fflush(stdout);
     
      if ((ch = getchar()) != EOF){
         printf("El caracter es %c\n", ch);
         
         /* Descartamos el resto de la linea */
         while ((ch = getchar()) != EOF && ch != '\n')
            ; /* Nada que hacer */
      }else
         break;
   }
   
   return EXIT_SUCCESS;
}


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

ometeotl

Ok rir3760, revisare tu ejemplo para analizarlo y entender mejor esto del getchar, gracias