将双打存储在C中的数组中

时间:2019-06-19 23:04:20

标签: c arrays dynamic

我真的需要帮助将双精度值存储在双精度数组中。我正在尝试使用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);



}

我有两个问题:

  1. 是有关缓冲区溢出的警告:

    Warning C6385   Reading invalid data from 'numSet':
    the readable size is '8000' bytes, but '-8' bytes may be read.  
    
  2. 当我尝试输入4个以上的数字时,程序崩溃并返回代码3

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)

我认为问题在于您如何结束输入循环,不需要scanf_s,请参阅监视窗口。我只是将结束条件更改为一些无数字字符。

Code :: Block监视窗口

enter image description here