【发布时间】:2019-06-19 23:04:20
【问题描述】:
我真的需要帮助将双精度值存储在双精度数组中。我正在尝试使用 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);
}
我有两个问题:
-
是关于缓冲区溢出的警告:
Warning C6385 Reading invalid data from 'numSet': the readable size is '8000' bytes, but '-8' bytes may be read. 当我尝试输入超过 4 个数字时,我的程序崩溃并返回代码 3
【问题讨论】:
-
你确定 size>0 当你做 double max = numSet[size - 1]; ?或者更一般地说,这就是所有代码吗?你是怎么做qsort的?
-
请注意,如果在 Unix 上运行,点击
^Z(control-Z) 将使您的程序进入暂停状态并让 shell 再次控制 - 而不会实际终止程序。在 Windows 上,输入^Z表示 EOF。 -
在引用数组中的(可能不存在的)数据之前,您不会检查
size是否至少为1。这是编译器的警告。 ——我看到你删除了一段代码sort the array using qsort。您显示的代码是否崩溃,或者只有您未显示的代码? (排序不一定是错的,但不需要得到min和max。) -
您是否需要使用数组?如果不需要数组,则您的程序远比必要的复杂。您的输入循环可以简单地累积所有输入值的总数,计算输入值的数量,并确定输入的最小值和最大值。
-
我看到的唯一错误是 1) 可能的缓冲区溢出(您在声明需要动态数组时已经承认)可以通过将循环条件更改为“修复”:@987654330 @,以及 2)
size为 0 时的各种错误,例如 a) 索引 -1 处的无效数组访问,因为编译器警告您,以及 b) 除以 0。