Почему мой float печатается как 0, даже если я ввожу 13.5 для него с помощью scanf?

Мне трудно понять, почему моя переменная float продолжает печатать 0, когда я ввожу ее как число.

код:

int num, month, day, year;
float price[10000];


printf("Enter item number: n");
scanf("%d", &num);
printf("Enter unit price: n");
scanf("%f", &price);
printf("Enter purchase date (mm/dd/yyyy): n");
scanf("%d/%d/%d", &month, &day, &year);

printf("ItemttUnitttPurchasen");
printf("    ttPricettDaten");
printf("%d      ", num);
printf("$%.2f     ", price); 
printf("      %d/%d/%dn", month, day, year);
return 0;

Я ввожу 555 для моего номера товара, 13.5 для моей цены и 10/24/2010 для моей даты. Когда я это сделал, он распечатал, что моя цена была $ 0.00. Он делает это для любого числа I вход. Почему?

4 ответов


просто изменить это:

float price[10000];

для этого:

float price;

потому что вы используете его как одну переменную, а не как массив


вы не можете вставить значение массива, как это -

scanf("%f", &price);

используйте цикл for для вставки значений в цену массива -

for(i=0; i<sizeWhatYouWant; i++){
 scanf("%f", &price[i]);
}

или просто изменить объявление float price[10000] to -

float price;

есть две вещи, чтобы заметить.

  1. изменить float price[10000]; до float price; Как вы будете использовать только один float переменная, поэтому вам не нужен массив.

  2. вам нужно проверить возвращаемое значение scanf() для обеспечения правильного ввода.

кроме того, в качестве примечания вы можете инициализировать локальные переменные, поскольку они не инициализируются автоматически.


вы объявили price как массив вам нужно сделать это таким образом

int num, month, day, year;
float price[10000];


printf("Enter item number: \n");
scanf("%d", &num);
printf("Enter unit price: \n");
scanf("%f", &price[0]); /* <---- it's not &price it's &price[0] */
printf("Enter purchase date (mm/dd/yyyy): \n");
scanf("%d/%d/%d", &month, &day, &year);

printf("Item\t\tUnit\t\tPurchase\n");
printf("    \t\tPrice\t\tDate\n");
printf("%d      ", num);
printf("$%.2f     ", price[0]); /* <---- it's not price it's price[0] */
printf("      %d/%d/%d\n", month, day, year);
return 0;

вы должны сохранить значение в первом элементе массива, а затем распечатать первый элемент, т. е. price[0].

если вы просто хотите прочитать одно значение, то вам не нужно объявлять price как массив, так что это будет решение

int num, month, day, year;
float price/* [10000] it doesn't need to be an array */;

printf("Enter item number: \n");
scanf("%d", &num);
printf("Enter unit price: \n");
scanf("%f", &price);
printf("Enter purchase date (mm/dd/yyyy): \n");
scanf("%d/%d/%d", &month, &day, &year);

printf("Item\t\tUnit\t\tPurchase\n");
printf("    \t\tPrice\t\tDate\n");
printf("%d      ", num);
printf("$%.2f     ", price);
printf("      %d/%d/%d\n", month, day, year);
return 0;

вы печатали адрес к первому элементу массива вместо значения по этому адресу, и он был преобразован в unsigned int или unsigned long int, поэтому, когда вы использовали "%f" спецификатор, он печатал 0.

в обоих случаях:

чтобы предотвратить такую ошибку, вы должны включить предупреждения компиляторов, если используете gcc

gcc -Wall -Wextra -Werror ${SOURCE_FILES} -o ${OUTPUT_FILE}

сделал бы это.

а также, при недопустимом вводе, ваша программа будет иметь неопределенное поведение, вам нужно проверить это scanf() действительно читали значение поручил это читал, что достигается путем проверки возвращаемого значения из scanf() что равно количеству совпадающих элементов, в вашем случае

if (scanf("%d", num) != 1)
    errorInputWasInvalid();

с просьбой 1 элемент, а затем scanf() вернуться 1.