为什么我的浮点数打印为0,即使我使用scanf输入13.5?

时间:2015-01-28 20:12:04

标签: c scanf

当我将其作为数字输入时,我无法弄清楚为什么我的浮点变量会保持打印输出为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("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;

我为我的商品编号输入555,为我的价格输入13.5,为我的日期输入10/24/2010。 当我这样做时打印出我的价格是0.00美元。它为我输入的任何数字执行此操作。为什么呢?

4 个答案:

答案 0 :(得分:4)

您不能像这样插入数组值 -

scanf("%f", &price);

使用for循环将值插入数组价格 -

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

或者只是将声明float price[10000]更改为 -

float price;

答案 1 :(得分:2)

只需改变一下:

float price[10000];

到此:

float price;

因为您将它用作单个变量而不是数组

答案 2 :(得分:2)

您已将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 intunsigned long int,因此当您使用{{1}时}说明符,它打印"%f"

在这两种情况下

为防止出现此类错误,如果使用0,则应启用编译器警告

gcc

会这样做。

而且,对于无效输入,您的程序将具有未定义的行为,您需要检查gcc -Wall -Wextra -Werror ${SOURCE_FILES} -o ${OUTPUT_FILE} 是否确实读取了您指示它读取的值,这是通过检查{{1的返回值来实现的在你的情况下,它等于匹配项的数量

scanf()

由于您要求scanf()项,因此if (scanf("%d", num) != 1) errorInputWasInvalid(); 必须返回1

答案 3 :(得分:2)

有两件事需要注意。

  1. float price[10000];更改为float price;,因为您只使用一个float变量,因此您不需要数组。

  2. 您需要检查scanf()的返回值,以确保输入正确。

  3. 另外,作为注释,您可能希望初始化局部变量,因为它们不会自动初始化。