我真的很想知道为什么当我使用双精度时这会搞砸我的代码。根据我的理解,double只是一个更精确的浮点数。然而在下面的代码中,如果我用double替换float,我会得到一个古怪的输出,即使所有代码都在进行输入,然后将其吐出来。
#include <stdio.h>
int y;
int z;
int i;
int n;
int r;
int c;
float e;
float d;
void main() {
puts("Enter Row Number:");
scanf("%i", &r);
puts("Enter Column Number:");
scanf("%i", &c);
float x[r][c];
int j = r;
for(y = 1; y <= r; y++) {
for(z = 1; z <= c; z++) {
scanf("%f", &x[y][z]);
}
}
for (y = 1; y <= r; y++) {
for(z = 1; z <= c; z++) {
printf("%g\t", x[y][z]);
}
puts("\n");
}
}
在使用float的情况下,在为行输入2,为列输入3之后,数字1-6,我得到1-6的输出,如预期的那样。但是使用double代替,并保持输入与之前相同,我得到{1.36224e-312,1.78905e-307,1.81506e-307,3.15957e + 263,5.35668e-315,3.44886e-313的输出}。显然,这甚至不接近正确,而且它不像我在这里处理复数...只是整数1-6。是什么给了什么?
答案 0 :(得分:0)
scanf %f
需要float
的地址。将scanf
的数据直接读取到不是本地的变量是危险的,因为很难看出它实际上不是float
。我会以这种方式更改代码以使其更加健壮:
float temp;
scanf("%f", &temp);
x[y][x] = temp;
答案 1 :(得分:0)
你的循环错了:
for(y = 1; y <= r; y++) {
for(z = 1; z <= c; z++) {
定义数组时
float x[r][c];
数组的索引从零到大小减去1。因此y
数组的x
限制为
x[0] /* first sub-array */
x[r - 1] /* last sub-array */
将循环更改为
for(y = 0; y < r; y++) {
for(z = 0; z < c; z++) {
请注意,它们现在从零开始,并使用小于比较运算符。