[C con Clase] Lo + básico

Steven Davidson srd4121 en njit.edu
Lun Mar 30 18:02:25 CEST 2009


Hola Bettina,

BETTINA CANTERO wrote:
> Buenas necesito ayuda con este pequeño código. Estoy comenzando mi 
> estudio en esto de la programación, y estoy estancada en esto. La
> idea es cargar un número determinado de caracteres a leer y luego 
> contar cuántas "a" se cargaron. Mi problema es que la iteración del 
> código no anda bien, y el contador me muestra un resultado de cuatro
> dígitos cuando he cargado solo 5 iteraciones para hacer.  Sé que es
> muy básico pero no puedo continuar con otra práctica sino puedo 
> resolver esta que creo es muy sencilla pero no sé cuál es mi error.
> Este es el código:

Veamos el código fuente.

> #include<conio.h>
> #include<stdio.h>
> void main()
> {
> int i,n,cont;

Aquí tienes parte del error que tienes. Declaras 'cont', pero no la 
inicializas. Por lo tanto, 'cont' contiene arbitrariamente un número 
cualquiera; solemos decir que contiene "basura". Al usar 'cont', estás 
operando con "basura" y por consiguiente obtendrás "basura".

La solución, en tu caso, es inicializar 'cont' a 0 (cero).

> char car;
> clrscr();
> printf("Ingrese la cantidad de caracteres a leer \n");
> scanf("%i",&n);
> /*car=getch();*/
> for(i=0;i<=n;i++)

Esto implica que realizarás n+1 iteraciones. Sospecho que esto es un 
error, pero quizá te interese iterar tantas veces.

>    {
>    car=getch();
>    printf("ingrese un caracter \n");
>    scanf("%c",&car);

No entiendo por qué tienes dos lecturas por iteración. Supongo que 
querías "arreglar" los problemas que te estaba dando este programa.

El problema es que 'getch()' no busca en el canal o "búfer" del teclado, 
sino directamente al teclado desde la BIOS, mientras que 'scanf()' sí 
lee desde el canal, el cual almacena los caracteres introducidos.

>    printf("el caracter ingresado es: %c\n",car);
>    /*car=getch();*/
>       if(car=='a')
>  {
>   cont++;
>   /*car=getch();*/
>  };
>     };
> printf("la cantidad de 'a' encontradas es de: %i \n",cont);
> getch();
> }
>  

En cuanto al comportamiento problemático de permitir introducir 
caracteres algunas alternándose, esto radica en que el canal de entrada 
(el teclado) contiene los caracteres introducidos. En el primer caso del 
ejemplo que nos diste, escribes: 5, pero el canal del búfer realmente 
contiene lo siguiente: "5\n", ya que pulsaste [ENTER]. Al leer el primer 
número, se extrae '5', pero deja '\n'. Por lo tanto, al llegar a la 
siguiente lectura, el programa simplemente lee y extrae el carácter '\n' 
que está en el canal de entrada, sin preguntar.

Las lecturas del canal de entrada sólo piden datos si el canal está 
vacía; si no lo está, entonces lee y extrae caracteres del canal. Esto 
es lo que está ocurriendo en tu programa. Pide leer un carácter, pero 
para la segunda lectura, ya tiene un '\n' a leer, y por tanto no pide 
leerlo.

Una solución es leer el carácter que quieres con 'scanf()' y luego 
extraer el carácter '\n' del canal de entrada para preparar este canal 
para la siguiente iteración. Por ejemplo,

for(...)
{
   scanf( "%c", &car );
   getchar();  /* para extraer '\n' */
   ...
}

Otra solución es leer todos los caracteres de golpe en una cadena de 
caracteres, si el usuario los introduce como una cadena. Por ejemplo,

char caracteres[1024];  /* máximo de 1024 */
...
scanf( "%s", caracteres );

Ahora puedes aplicar cualesquier criterios que quieras a la cadena.


Espero haber aclarado las dudas.

Steven





Más información sobre la lista de distribución Cconclase