我真的需要帮助将双精度值存储在双精度数组中。我正在尝试使用scanf_s,它可以工作。但是,如果我尝试输入四个以上的值,程序将崩溃并返回错误代码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
答案 0 :(得分:2)
while (scanf_s("%lf", &number) == 1)
{
numSet[size] = number;
size++;
}
代替这种用法
while (scanf_s("%lf", &number) == 1 && size <= 1000)
{
numSet[size] = number;
size++;
}
您的循环无限进行,因为它没有终止符。
scanf_s
仅从键盘读取值,并具有另一个参数来设置其最大输入缓冲区值,这对限制您的输入很有用。
您可以做的是在允许用户输入值之前先从用户那里读取大小,或者您可以每次询问用户是否要向数组中添加更多值。
例如:
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);
}
此外,scanf_s
函数返回扫描的值的数目,并且每次都是1时,您总是要取一个双精度值。
因此,即使将其删除,也不会带来太大麻烦。
答案 1 :(得分:0)
如评论中所述,有可能
double max = numSet[size - 1];
评估为
double max = numSet[-1];
size = 0
时。我猜测double
的宽度为8个字节,因此编译器警告它可能会尝试从内存中读取-1 * 8 = -8
个字节。
答案 2 :(得分:0)