Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda con scanf(...); gets(...); y fgets(...);

Estas en el tema de Duda con scanf(...); gets(...); y fgets(...); en el foro de C/C++ en Foros del Web. Buenos dias, Vengo a este foro para consultar una pequeña duda, mi consulta tiene que ver con las diferencias de las funciones scanf, gets y ...
  #1 (permalink)  
Antiguo 28/04/2012, 08:26
 
Fecha de Ingreso: marzo-2012
Mensajes: 7
Antigüedad: 12 años, 2 meses
Puntos: 0
Pregunta Duda con scanf(...); gets(...); y fgets(...);

Buenos dias,

Vengo a este foro para consultar una pequeña duda, mi consulta tiene que ver con las diferencias de las funciones scanf, gets y fgets, por ejemplo, en un programa dentro de un do while se tiene que se pide un nombre, notas, etc..., para calcular el promedio de notas de una persona x, y al final se pregunta que si se desea calcular mas promedios, si pongo si te pregunta otro nombre, otras notas y asi...

Mi duda va en que si uso scanf no podria entregarle un nombre con el apellido, por que el scanf no considera los espacios, y si uso gets o fgets me va todo bien, hasta la 2º vez, si le digo que deseo calcular mas promedios, desde la 2º vez en adelante ya no me deja ingresar otro nombre, es decir, me aparece el mensaje de Ingrese nombre del alumno pero de hay se va directamente a preguntarme la cantidad de notas. Hay les dejo el codigo abajo para que entiendan que es a lo que me refiero.

Entonces no entiendo como puedo hacer para ingresar un nombre con apellido pero que ademas me funciones bien cada ves que le pongo que si quiero promediar mas notas...

Lo pregunto para entender bien este lenguaje, que aun que llevo estudiandolo desde hace rato todavia le encuentro muchos taldos y comportamientos raros xD

Código:
#include <stdio.h>

float promedio(int valores[], int cantidad) {
    int i;
    float suma = 0.0;

    for (i = 0; i < cantidad; ++i)
        suma += valores[i];

    return suma / (float) cantidad;
}

int main() {

    int notas[10];
    char nombre[20];
    char opcion[3];
    int n, i;
    int vuelta = 0;

    do {
        if (vuelta)
        printf("\n");

        printf("Ingrese nombre del alumno: ");
        gets(nombre);

        printf("\n¿Cuantas notas tiene %s?: ", nombre);
        scanf("%d", &n);


        for (i = 0; i < n; ++i) {
            if (i == 0)
            printf("\n");

            printf("  Nota %d: ", i + 1);
            scanf("%d", &notas[i]);
        }

        printf("\nEl promedio de %s es %.1f\n\n", nombre, promedio(notas, n));

        printf("\aDesea calcular m\ás promedios (Si/No)?: ");
        scanf("%s", opcion);

        vuelta++;

    } while (opcion[0] == 's' || opcion[0] == 'S');

    return 0;
}
  #2 (permalink)  
Antiguo 28/04/2012, 09:08
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 1 mes
Puntos: 228
Respuesta: Duda con scanf(...); gets(...); y fgets(...);

Basicamente lo que te pasa es que no sabes como trabaja el sistema operativo.
Cuando uno preciona enter se envia el caracter '\n' al buffer del teclado.
La funcion gets lee hasta que encuentra ese caracter.

En cambio scanf("%s", opcion); NO... deja el caracter '\n' en el buffer....asi cuando vuelve a relizaqr el ciclo gets se encuentra con ese caracter y te deja el nombre nulo.

Se se soluciona vaciando ese buffer a mano.

while(getchar() != '\n');

Pon ese linea antes de empezar cada ciclo.
  #3 (permalink)  
Antiguo 29/04/2012, 18:26
 
Fecha de Ingreso: marzo-2012
Mensajes: 7
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Duda con scanf(...); gets(...); y fgets(...);

Cita:
Iniciado por sam90 Ver Mensaje
Basicamente lo que te pasa es que no sabes como trabaja el sistema operativo.
Cuando uno preciona enter se envia el caracter '\n' al buffer del teclado.
La funcion gets lee hasta que encuentra ese caracter.

En cambio scanf("%s", opcion); NO... deja el caracter '\n' en el buffer....asi cuando vuelve a relizaqr el ciclo gets se encuentra con ese caracter y te deja el nombre nulo.

Se se soluciona vaciando ese buffer a mano.

while(getchar() != '\n');

Pon ese linea antes de empezar cada ciclo.
Gracias por la explicacion, ahora me quedo mas claro.

Aun asi encontre este uso del scanf - > scanf("%[^\n]"); y lo encontre de mejor uso...

Saludos.

Etiquetas: funcion, int, programa, scanf
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:33.