为什么我的浮点数打印为 0,即使我使用 scanf 为它输入 13.5?
Why does my float print out as 0 even though I input 13.5 for it using 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 美元。它对我输入的任何数字都这样做。为什么?
只需更改此:
float price[10000];
对此:
float price;
因为你把它当作一个变量而不是一个数组来使用
您已将 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()
确实读取了您指示它读取的值,这是通过检查 return 来自 scanf()
的值等于匹配项的数量,在您的情况下
if (scanf("%d", num) != 1)
errorInputWasInvalid();
由于您要请求 1
项,因此 scanf()
必须 return 1
.
您不能像这样插入数组值 -
scanf("%f", &price);
使用 for 循环将值插入数组价格 -
for(i=0; i<sizeWhatYouWant; i++){
scanf("%f", &price[i]);
}
或者只是将声明 float price[10000]
更改为 -
float price;
有两点需要注意。
将 float price[10000];
更改为 float price;
,因为您将只使用一个 float
变量,因此不需要数组。
您需要检查 scanf()
的 return 值以确保正确输入。
另外,请注意,您可能需要初始化局部变量,因为它们不会自动初始化。
我无法弄清楚为什么当我将浮点变量作为数字输入时,它一直打印出 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 美元。它对我输入的任何数字都这样做。为什么?
只需更改此:
float price[10000];
对此:
float price;
因为你把它当作一个变量而不是一个数组来使用
您已将 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()
确实读取了您指示它读取的值,这是通过检查 return 来自 scanf()
的值等于匹配项的数量,在您的情况下
if (scanf("%d", num) != 1)
errorInputWasInvalid();
由于您要请求 1
项,因此 scanf()
必须 return 1
.
您不能像这样插入数组值 -
scanf("%f", &price);
使用 for 循环将值插入数组价格 -
for(i=0; i<sizeWhatYouWant; i++){
scanf("%f", &price[i]);
}
或者只是将声明 float price[10000]
更改为 -
float price;
有两点需要注意。
将
float price[10000];
更改为float price;
,因为您将只使用一个float
变量,因此不需要数组。您需要检查
scanf()
的 return 值以确保正确输入。
另外,请注意,您可能需要初始化局部变量,因为它们不会自动初始化。