我尝试在函数中使用EOF进行用户输入,并相应地修改数组,因此在main函数中它将是该值。 我尝试使用Google搜索并阅读人们的答案,但我仍然无法让它工作。
void Get_Data(double data[], double original[], int length)
{
int count = 0;
double value = 0;
printf("Enter data and Ctrl + D when you're done(Ctrl + Z for Windows): n");
while (scanf("%f", &value) != EOF)
{
data[count] = value;
original[count] = data[count];
count++;
}
printf("%fn", data[1]);
}
int main()
{
int i;
double sum, original[4] = {0}, datas[4] = {0};
Get_Data(datas, original, 4); // I'm just trying to get this to work
system("pause");
return 0;
}
我读到了在参数中使用 * 在 C 中通过引用传递的信息,但我没有得到正确的结果。
要扫描double
值,您需要使用%lf
格式说明符。
从C11
,第7.21.6.2章,
l (ell)
指定应用以下d
、i
、o
、u
、x
、X
或n
转换说明符 指向类型指向long int
或unsigned long int
的参数;以下a
、A
、e
、E
、f
、F
、g
或G
转换说明符适用于 类型指向double
的参数;[....]
可是
-
当你正确地传递
length
时,在你的函数中使用它来限制count
(索引),以避免溢出分配的内存。 -
您还应该检查
scanf()
是否成功(通过根据应扫描的项目数检查返回值)。仅检查敌人EOF
是不够的,scanf()
也可以在需要处理的匹配失败的情况下返回 0。
将while (scanf("%f", &value) != EOF)
更改为while (scanf("%lf", &value) == 1)
。
首先,要检查输入过程是否成功,不应使用 scanf("...", ...) != EOF
。想一想:如果用户输入一个字符怎么办?然后scanf()
将在匹配失败后返回 0,0 != EOF
.
其次,要扫描具有double
类型的变量,就必须使用"%lf"
。你可能会问:为什么?我可以使用"%f"
打印float
和double
!
嗯,那是因为通常sizeof (float) != sizeof (double)
.假设sizeof (float) == 4
和sizeof (double) == 8
:
- 在
scanf()
语句中,程序必须知道要写入的内存块的长度。如果有"%f"
,并且0x12345678
作为相应的地址传递,则填充0x12345678
到0x1234567C
,而当有"%lf"
,并且0x12345678
作为地址传递时,从0x12345678
到0x12345680
的内存被填充。 - 由于
printf()
有可变参数,float
变量被隐式转换为double
,然后传递。很明显,将float
转换为double
不会导致任何信息丢失,因此一切都很好。
综上所述,重点是float
s会自动提升为double
s,但float *
s不会转换为double *
。