Ciclo for

Estado
Cerrado para nuevas respuestas.

Pastore16

Club Atlético Huracán
Hola tengo un problema, cuando ingreso el nombre de la primera persona como que se me bugea todo el programa es decir que me salta hasta el 7 de la nada les dejo el codigo y una imagen de lo que sucede. La idea del programa es poder ingresar 20 nombres de alumnos con sus notas y imprimir quien esta aplazado.

C++:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream>

int main()
{
    int i, val;
    char nom;
    system("cls");
    for (i=1;i<=20;i++)
    {
        printf("Ingrese el nombre %d \n", i);
        scanf("%c",&nom);
        printf("Ingrese la nota %d \n", i);
        scanf("%d",& val);
        if (val < 4)
        {
            printf("El alumno %c se encuentra aplazado",nom);
        }
    }
    system("pause");
}
Imagen:


ven me salta directo al 7 no se que onda
 

Dr. Wolftein

Computer's Scientist
Miembro del equipo
Administrador
Especialista de Tecnología
Estas haciendo un buffer overflow en linea

"scanf("%c" &nom)"

cambia char nom por char nom[32]; o mayor.... y estas leyendo solo 1 caracter, no la palabra; usa

char nom[64];
scanf("%s", &nom);

%c -> Caracter ("P") de "Pedrito
%s -> Palabra ("Pedrito")

P.D: DevCPP dios mio
 

Franeg95

CARP
Ex-Staff
A esto que te comento Wolftein le agregaría que también limpies el buffer del teclado antes de cada lectura, es una buena práctica por decir de un modo ya que evitas que basura que pueda estar en el buffer llegue a tu variable (imaginate un enter demás y esas cosas).

En c tenes fflush(stdin);

fflush es la que borra el archivo y stdin lee el archivo (standar input).

Esto lo necesitas porque al trabajar con chars y strings se interpreta todo como carácter. Si no sabés el salto de linea (el enter) es un carácter (no visible) que se expresa así: '\n' cuando vos por ejemplo pedís un carácter con scanf, el bicho lee hasta el enter pero nunca lo borra. En la siguiente lectura del scanf mira si el buffer está vació, si no lo está te devuelve lo que encuentra (en el caso de especificar "c" como primer argumento de devuelve el '\n' lo mismo si pones "s"). Diferente es el caso cuando trabajas con lecturas de numeros (%d) ya que ahí no está considerando valores distintos a 0-9

En definitiva y resumen:

antes del scanf cuando labures con lectura de strings/chars ejecuta la función: "fflush(stdin);" con esto limpias el buffer y te ahorras problemas. Para usarla importa stdio.h
 

Pastore16

Club Atlético Huracán
Gracias Wolftein y Franeg95 por el consejo, lo voy a tener en cuenta.
Pueden cerrar si quieren. Saludos.
 
Estado
Cerrado para nuevas respuestas.
Arriba