在C中的数组中存储双精度

在C中的数组中存储双精度,c,arrays,dynamic,C,Arrays,Dynamic,我真的需要帮助在双数组中存储双值。我正在尝试使用scanf_s,它很有效。但是如果我尝试输入4个以上的值,我的程序就会崩溃并返回错误代码3 我实际上需要一个动态数组,但由于我在这方面遇到了太多错误,我改变了,我尝试使用一个通用数组,这样我就可以为这个项目获得至少一些分数 这是我现在使用的代码 int main() { printf("Enter white-space separated real numbers. Terminate input with ^Z\n"); //g

我真的需要帮助在双数组中存储双值。我正在尝试使用scanf_s,它很有效。但是如果我尝试输入4个以上的值,我的程序就会崩溃并返回错误代码3

我实际上需要一个动态数组,但由于我在这方面遇到了太多错误,我改变了,我尝试使用一个通用数组,这样我就可以为这个项目获得至少一些分数

这是我现在使用的代码

int main()
{
    printf("Enter white-space separated real numbers. Terminate input with ^Z\n");
    //get the dynamic array

    double numSet[1000] = { 0 };
    int size = 0;
    double number;
    while (scanf_s("%lf", &number) == 1)
    {
        numSet[size] = number;
        size++;
    }


    //sort the array using qsort 


    //range of the array 

    double min = numSet[0];
    double max = numSet[size - 1];


    //get the mean 
    double sum = 0.0;
    for (size_t i = 0; i < size; i++)
    {
        sum += numSet[i];
    }

    double mean = sum / size;



    printf("Range: [%.2f ... %.2f]\n", min, max);
    printf("Arithmetic mean is: %f", mean);



}
当我试图输入4个以上的数字时,我的程序崩溃并返回代码3


正如评论中提到的,有可能

double max = numSet[size - 1];
评价为

双最大值=numSet[-1];
当大小=0时。我猜double是8字节宽的,因此编译器警告它可能试图从内存中读取-1*8=-8字节。

我认为问题在于如何结束输入循环,不需要扫描,请查看“监视”窗口。我只是将结束条件更改为一些无数字字符

代码::阻止监视窗口

而不是这个用途

while (scanf_s("%lf", &number) == 1 && size <= 1000)
    {
        numSet[size] = number;
        size++;
    }
此外,scanf_s函数返回扫描的值的数量,每次为1,因为您总是使用一个双精度值


因此,即使您删除它,也不会有太多问题。

您确定在执行double max=numSet[size-1]时,size>0吗?或者更一般地说,这就是全部代码吗?如何进行qsort?请注意,如果在Unix上运行,点击^Z control-Z将使您的程序进入暂停动画,并让shell再次控制—而不会实际终止程序。在Windows上,键入^Z表示EOF。在引用数组中可能不存在的数据之前,不检查大小是否至少为1。这是编译器发出的警告我看到您删除了一段代码,使用qsort对数组进行排序。您显示的代码是否崩溃,或者仅显示您未显示的代码?排序不一定是错误的,但不需要获取最小值和最大值。是否需要使用数组?如果不需要数组,那么程序将比需要的复杂得多。您的输入循环可以简单地累积所有输入值的总数,计算输入值的数量,并确定输入的最小值和最大值。我看到的唯一错误是1一个可能的缓冲区溢出,您在声明需要一个动态数组时确认了这一点,该数组可以通过将循环条件更改为:whilesize<1000&&scanf_s%lf,&number==1来修复,当大小为0时,会出现2个不同的错误,例如编译器警告您,索引-1处的数组访问无效,以及b除以0。查看MS手册页面的,可以发现您的额外参数想法对于double是错误的。它显示了一个使用float而不使用额外参数的示例,评论说,与字符串相关的转换说明符需要长度,而不是数字说明符这很有趣,因为我们链接到了几乎相同的URL,但得出了相反的结论。@JonathanLeffler,您似乎比我更仔细地阅读了文档。它说,指定所有c、c、s、s或字符串控件集[]参数的大小,而不提数字类型,正如您所建议的那样。谢谢
while (scanf_s("%lf", &number) == 1)
    {
        numSet[size] = number;
        size++;
    }
while (scanf_s("%lf", &number) == 1 && size <= 1000)
    {
        numSet[size] = number;
        size++;
    }
char option = 'Y';
while ( (scanf_s("%lf", &number) == 1 && option == 'Y'){
   // code to enter a new number
   printf("Do you want to add more numbers? (Y/N) ");
   scanf("%c", &option);
}