Comportement de scanf lorsque la nouvelle ligne est dans la chaîne de format

Ci-dessous, la copie de mon code. Fondamentalement, je dois créer un programme qui calcule le salaire en fonction de “codes de paiement”, par exemple la position du travailleur. J’ai créé mon relevé de compte et tout fonctionne à l’exception du tout début lorsque je saisis le premier code de paiement. J’entre le premier code de paiement, il passe à la ligne suivante, en le laissant vide. J’ai mis un autre numéro, et le numéro précédent est utilisé comme il est supposé. Ensuite, tout va bien après. Je suis sûr que c’est une solution simple mais c’est un peu délicat pour moi. De plus, je ne sais pas exactement comment je suis censé formater mon code ici pour qu’il ressemble à ce qu’il est sur le serveur, alors je m’excuse pour la façon confuse dont il a l’air.

#include  //precomstackd 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); } 

    Le caractère '\n' de la chaîne de format de scanf("%d\n", &paycode) correspond à un nombre quelconque de caractères d’espacement (espace, tabulation, nouvelle ligne, etc.) – caractères pour lesquels la fonction isspace déclarée dans ctype.h true ) dans l’entrée donnée. Par conséquent, l’appel scanf lira et éliminera n’importe quel nombre de caractères jusqu’à ce qu’il rencontre un caractère non-blanc auquel il retournera. Cela est vrai pour tout caractère d’espacement dans la chaîne de format de scanf et pas seulement le caractère de nouvelle ligne. Par exemple, les éléments suivants présenteront le même comportement:

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

    Vous devriez changer votre appel scanf en

     scanf("%d", &paycode); 

    De plus, au lieu de printf("%s", "Paycode: "); vous pouvez simplement écrire printf("Paycode: "); Vous avez commenté que stdio.h est un en-tête précompilé . Ce n’est pas. C’est un fichier d’en-tête qui contient les définitions de macro et les déclarations de fonction ou les prototypes. Ce n’est pas un fichier object dans le sens où il est précompilé .

    La fonction scanf reçoit en paramètre le format qu’elle attend de vous. En transmettant scanf("%d\n", &paycode); vous dites “Hé, ordinateur, lis un numéro ET une nouvelle ligne, et enregistre-le dans la variable paycode “. De plus, scanf lira et ignorera les espaces.

    Essayez de le scanf("%d", &paycode); par scanf("%d", &paycode); , de sorte que l’ordinateur ne lit et enregistre que le numéro.

    changement

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

    à

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

    Changez le en:

     scanf("%d", &paycode); 

    La constante de nouvelle ligne est source de confusion ici. Vous devez changer le premier

    scanf (“% d \ n”, & paycode);

    à

    scanf (“% d”, & paycode);