fscanf无法正确读取浮点数

—这是一个家庭作业问题—

我在使用fscanf从文本文件中读取浮点值时遇到问题。

基本上我正在尝试从文件中读取浮点值并将它们存储在动态数组中。 输入文件每行有两个浮点数。 所以一行可能是“0.85 7.34”(不带引号)。 所以我试图使用fscanf(fp,“%f%f”,&coordinates [i],&coordinates [i ++])来读取2个浮点值。 当我打印它显示为0.00000。 下面是我编写的代码及其生成的输出。

#include  #include  int main (int argc, char *argv []) { FILE * fp = fopen("nums", "r"); float *coordinates; float *tmp; int i = 0; int ARRAY_SIZE = 5; coordinates = malloc(5*sizeof(float)); while (fscanf(fp,"%f %f", &coordinates[i], &coordinates[i++]) > 1) { printf("iteration# %d | coord1 = %f coord2 = %f \n", i, &coordinates[i-1], &coordinates[i]); if (i >= ARRAY_SIZE) { tmp = realloc(coordinates, (i*2)*sizeof(float)); coordinates = tmp; ARRAY_SIZE = i*2; } i++; } for(i = 0; i < 8; i++) printf("%f\n", &coordinates[i]); return 0; } 

OUTPUT:

 iteration# 1 | coord1 = 0.000000 coord2 = 0.000000 iteration# 3 | coord1 = 0.000000 coord2 = 0.000000 iteration# 5 | coord1 = 0.000000 coord2 = 0.000000 iteration# 7 | coord1 = 0.000000 coord2 = 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 

你不要使用“地址”-operator & printffscanf需要一个指向数据的指针,因此它知道可以更改变量值,而printf则不需要。

更改:

 printf("iteration# %d | coord1 = %f coord2 = %f \n", i, &coordinates[i-1], &coordinates[i]); 

至:

 printf("iteration# %d | coord1 = %f coord2 = %f \n", i, coordinates[i-1], coordinates[i]); 

第一个问题:

  while (fscanf(fp,"%f %f", &coordinates[i], &coordinates[i++]) > 1) 

你试图在&coordinates[i]使用i的值,并在&coordinates[i++]修改它,而没有插入序列点。 这样做的行为是未定义的 ,很可能不会做你想要的。 使用&coordinates[i+1]作为第二个参数。 注意这意味着你必须在i += 2或类似的循环中更新i 。 请注意, 不能保证&coordinates[i]&coordinates[i++]之前得到评估。

第二个问题:

 printf("%f\n", &coordinates[i]); 

再次,你调用了未定义的行为; 你已经告诉printf期望一个float类型的值,但你传递的是float *类型的值。 失去&scanfprintf在这方面不对称。

头刮管:

您知道每行将有2个值,但您将数组大小设置为5(而不是4或6或8)。 您允许调整arrays的大小(正确地,我可能会添加),但您已经为打印循环硬编码了8的大小,而不是使用读取的实际项目数。