【发布时间】:2013-01-31 04:15:09
【问题描述】:
---这是一道作业题---
我在使用 fscanf 从文本文件中读取浮点值时遇到问题。
基本上我正在尝试从文件中读取浮点值并将它们存储在动态数组中。 输入文件每行有两个浮点数。所以一行可能是“0.85 7.34”(不带引号)。所以我尝试使用 fscanf(fp, "%f %f", &coordinates[i], &coordinates[i++]) 来读取 2 个浮点值。当我打印它显示为 0.00000。下面是我编写的代码和它产生的输出。
#include <stdio.h>
#include <stdlib.h>
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;
}
输出:
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
【问题讨论】:
-
小心。
fscanf(fp,"%f %f", &coordinates[i], &coordinates[i++])是未定义的行为,因为您无法保证coordinates[i]是否在coordinates[i++]之前或之后进行评估,因此您可能会混淆(因为当您认为i可能不会增加时)!未指定 args 的评估顺序。 -
所以你的意思是 i 可以在计算坐标[i] 之前递增?
-
是的,这是可能的。另外,您可能想要
++i而不是i++(假设参数按照您想要的顺序进行评估,但事实并非如此)。在 C 中,前增量和后增量之间存在差异。实际上,也许你真正想要的是i++。但是,评估的顺序是不确定的。