读取用户输入并使用 C 函数中的 EOF 修改数组



我尝试在函数中使用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)
指定应用以下diouxXn转换说明符 指向类型指向 long intunsigned long int 的参数;以下aAeEfFgG转换说明符适用于 类型指向 double 的参数;[....]

可是

  1. 当你正确地传递length时,在你的函数中使用它来限制count(索引),以避免溢出分配的内存。

  2. 您还应该检查scanf()是否成功(通过根据扫描的项目数检查返回值)。仅检查敌人EOF是不够的,scanf()也可以在需要处理的匹配失败的情况下返回 0。

while (scanf("%f", &value) != EOF)更改为while (scanf("%lf", &value) == 1)

首先,要检查输入过程是否成功,不应使用 scanf("...", ...) != EOF 。想一想:如果用户输入一个字符怎么办?然后scanf()将在匹配失败后返回 0,0 != EOF .

其次,要扫描具有double类型的变量,就必须使用"%lf"。你可能会问:为什么?我可以使用"%f"打印floatdouble

嗯,那是因为通常sizeof (float) != sizeof (double).假设sizeof (float) == 4sizeof (double) == 8

  • scanf()语句中,程序必须知道要写入的内存块的长度。如果有"%f",并且0x12345678作为相应的地址传递,则填充0x123456780x1234567C,而当有"%lf",并且0x12345678作为地址传递时,从0x123456780x12345680的内存被填充。
  • 由于printf()有可变参数,float变量被隐式转换为double,然后传递。很明显,将float转换为double不会导致任何信息丢失,因此一切都很好。

综上所述,重点是float s会自动提升为double s,但float * s不会转换为double *

最新更新