Iakovl
Iakovl

Reputation: 1093

Something strange with a simple program, possible scanf problem

I have a simple homework... to make a C program that takes 3 values 3 times

  1. id of a food (char)
  2. cal value of food (float)
  3. amount of food (float)

Here is the code and the output the program gives me:

#include <stdio.h>
#define NUM_OF_FOOD 3

int main()
{
    float food_cal[NUM_OF_FOOD];
    float food_amount[NUM_OF_FOOD];
    char food_id[NUM_OF_FOOD];
    int i;
    float total_cal=0;
    int most_fat_food_id=0;
    printf("enter the following data: food ID, Cal value and Amount eaten \nexample A 10 3\n");
    for (i=0;i<NUM_OF_FOOD;i++)
    {
        printf("\nEnter product #%d:",i);
        int inputLength = scanf("%c %f %f",&food_id[i],&food_cal[i],&food_amount[i]);
        if ( inputLength < 3 ) {
            printf("input error, input length was %d excpexted 3", inputLength);
            break;
        }
        if ( !((food_id[i]>96 && food_id[i]<123) || (food_id[i]>64 && food_id[i]<91)) ) {
             printf("ID input error");
             break;
        }
        if ( food_cal[i] < 0 ) {
            printf("Food Cal input error");
            break;
        }
        if ( food_amount[i] < 0 ) {
            printf("Food Amount input error");
            break;
        }
        printf("\n%c %5.2f %5.2f",food_id[i],food_cal[i],food_amount[i]);
    }
    for (i=0;i<NUM_OF_FOOD;i++)
        total_cal+=food_cal[i]*food_amount[i];

    printf ("\nTotal amount of calories is %5.2f\n",total_cal);
    for (i=1;i<NUM_OF_FOOD;i++)
         most_fat_food_id = (food_cal[most_fat_food_id]<food_cal[i]) ? i : most_fat_food_id;

    printf ("\nThe most fattening product is: %c with %5.2f calories",food_id[most_fat_food_id],food_cal[most_fat_food_id]);

    return 0;
}

/*
enter the following data: food ID, Cal value and Amount eaten 
example A 10 3

Enter product #0:A 1000 2

A 1000.00  2.00
Enter product #1:B 500 3
input error, input length was 1 excpexted 3
Total amount of calories is 2000.00

The most fattening product is: A with 1000.00 calories
*/

it just skips the input of the 3rd

No idea why... two people looked at the code, looked fine but still have an error.

Upvotes: 0

Views: 286

Answers (3)

KevinDTimm
KevinDTimm

Reputation: 14376

You don't consume the '\n'

the quick/dirty method is to add a variable:

char readNewLine;

after your scanf(), add another:

scanf("%c", &readNewLine);

This is ugly, but it will suffice - better methods will become available after you've used C for a while.

Upvotes: 0

John Boker
John Boker

Reputation: 83729

after line 33 add:

char nl = 0;
scanf("%c", &nl);

that will consume the final newline character that's screwing things up.

after the said suggestion, this is the output:

./test
enter the following data: food ID, Cal value and Amount eaten
example A 10 3

Enter product #0:a 10 2

a 10.00  2.00
Enter product #1:b 3 29

b  3.00 29.00
Enter product #2:c 32 4

c 32.00  4.00
Total amount of calories is 235.00

The most fattening product is: c with 32.00 calories

Upvotes: 0

pmg
pmg

Reputation: 108986

Input: A 1000 2[ENTER]B 500 3[ENTER]...

The first scanf("%c %f %f") reads 'A', 1000, and 2 and stops at the [ENTER]

The second scanf("%c %f %f") reads the [ENTER] and chokes with the B for the "%f" conversion.

You can try using scanf(" %c %f %f") to force a skip of optional whitespace before reading the char.

Upvotes: 1

Related Questions