Comportamiento de scanf cuando la nueva línea está en la cadena de formato

4 minutos de lectura

Comportamiento de scanf cuando la nueva linea esta en la
usuario3324251

A continuación se muestra la copia de mi código. Básicamente, necesito crear un programa que calcule el pago en función de los “códigos de pago”, por ejemplo, la posición del trabajador. Creé mi declaración de cambio y todo funciona excepto el principio cuando ingreso el primer código de pago. Ingreso el primer código de pago, pasa a la siguiente línea, dejándolo en blanco. Ingresé otro número, y ejecuta ese número y el número anterior de la forma en que se supone que debe hacerlo. Entonces, después de eso, todo funciona bien. Estoy seguro de que es una solución simple, pero está siendo un poco complicado para mí. Además, no estoy seguro exactamente de cómo se supone que debo formatear mi código aquí para que se vea como lo hace en el servidor, así que pido disculpas por la forma confusa en que se ve.

#include <stdio.h> //precompiled header
int main(void)
{
    //declare variables
    unsigned int counter = 0; //counters to calculate amount of workers paid
    unsigned int counter2 = 0;
    unsigned int counter3 = 0;
    unsigned int counter4 = 0;

    int paycode;
    float overtime; //amount of overtime hours
    float salary; //weekly salary
    float hoursWorked;
    float hourlyRate;
    float grossWeeklySales; //weekly sales for commissioned workers
    int itemsProduced;
    float fixedAmount; //money given per item produced

    //prompt for input
    printf("Please enter the employee's paycode.\n");
    printf("1: Manager\n");
    printf("2: Hourly Worker\n");
    printf("3: Commission Worker\n");
    printf("4: Pieceworker\n");
    printf("-1 to end\n");
    printf("%s","Paycode: ");
    scanf("%d\n", &paycode);

    while (paycode != -1)//begin while loop
    {
        switch(paycode)
        {
        case 1: //calculate manager's pay
            printf("Manager selected.\n");        
            printf("Enter weekly salary: $ ");
            scanf("%f", &salary);
            counter = counter + 1;
            printf("Weekly salary is %.2f\n\n", salary);
            break;
        case 2:
            printf("Hourly worker selected.\n");        
            printf("Enter hourly rate: $");
            scanf("%f", &hourlyRate);
            printf("Enter hours worked: ");
            scanf("%f", &hoursWorked);
            if(hoursWorked<=40) //if statement to calculate overtime
            {
                salary=hourlyRate*hoursWorked;
                printf("No overtime worked.");
            }
            else
            {
                salary=40.0*hourlyRate+(hoursWorked-40)*1.5*hourlyRate;
                overtime = hoursWorked - 40;
                printf("Total amount of overtime worked: %.2f\n", overtime);
            }
            counter2 = counter2 +1;        
            printf("Weekly salary is: $%.2f\n\n", salary); 
            break;
        case 3:
            printf("Commissioned worker selected.\n");        
            printf("Enter gross weekly sales: $");
            scanf("%f", &grossWeeklySales);
            salary=.057*grossWeeklySales+250;
            counter3 = counter3 +1;
            printf("Weekly salary is: $%.2f\n\n", salary);
            break;
        case 4:
            printf("Pieceworker Selected.\n");        
            printf("Enter amount of items produced: ");
            scanf("%d", &itemsProduced);
            printf("Enter the fixed pay per item produced: $ ");
            scanf("%f", &fixedAmount);
            salary=itemsProduced*fixedAmount;
            counter4 = counter4 + 1;
            printf("Weekly salary is: $%.2f\n\n", salary);
        }
        //get next input
        printf("Please enter paycode, -1 to end.\n");
        printf("%s","Paycode: ");
        scanf("%d", &paycode);    
    }
    printf("Number of managers paid: %d\n", counter); //display amount of workers paid
    printf("Number of hourly workers paid is: %d\n", counter2);
    printf("Number of commisioned workers is: %d\n", counter3);
    printf("Number of piece workers paid is: %d\n\n", counter4);
}

Comportamiento de scanf cuando la nueva linea esta en la
jajaja

los '\n' carácter en la cadena de formato de scanf("%d\n", &paycode) coincide con cualquier número de caracteres de espacio en blanco (espacio, tabulador, nueva línea, etc. – caracteres para los que el isspace función declarada en ctype.h produce verdadero) en la entrada dada. Por lo tanto, los scanf call leerá y descartará cualquier cantidad de caracteres de espacio en blanco hasta que encuentre un carácter que no sea un espacio en blanco, momento en el que regresará. Esto es cierto para cualquier carácter de espacio en blanco en la cadena de formato de scanf y no solo el carácter de nueva línea. Por ejemplo, lo siguiente exhibirá el mismo comportamiento:

scanf("%d ", &paycode)
         ^ a space

Deberías cambiar tu scanf llamar a

scanf("%d", &paycode);

También, en lugar de printf("%s", "Paycode: "); simplemente puedes escribir printf("Paycode: ");
has comentado que stdio.h es un precompilado encabezamiento. Que no es. Es un archivo de encabezado que contiene definiciones de macros y declaraciones de funciones o prototipos. No es un archivo de objeto en el sentido de ser precompilado.

Comportamiento de scanf cuando la nueva linea esta en la
arturochamz

La función scanf recibe como parámetro el formato que espera de usted. al pasar scanf("%d\n", &paycode); estás diciendo “Oye, computadora, lee un número Y una nueva línea, y guárdalo en el paycode variable”. Además, scanf leerá e ignorará los espacios en blanco.

Intenta cambiarlo a scanf("%d", &paycode);por lo que la computadora solo lee y guarda el número.

  • Gracias. Sabía que era algo simple que me estaba perdiendo.

    – usuario3324251

    18 de febrero de 2014 a las 16:29

  • no solo una nueva línea, sino cualquier número de caracteres de espacio en blanco. scanf no regresará hasta que encuentre un carácter que no sea un espacio en blanco.

    – ajay

    18 de febrero de 2014 a las 17:03

cambiar

scanf("%d\n", &paycode);

para

scanf("%d", &paycode);

scanf("%d\n", &paycode);
         ^^ Scanf is waiting for this newline to come.

cambiarlo a:

scanf("%d", &paycode);

La constante de nueva línea es un asunto confuso aquí. Tienes que cambiar el primero.

scanf(“%d\n”, &codigo de pago);

para

scanf(“%d”, &codigo de pago);

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad