【问题标题】:trying to read integer with scanf in array试图用数组中的scanf读取整数
【发布时间】:2017-10-25 10:11:05
【问题描述】:

我编写了一些代码来比较一周的温度。

我做了两个函数,一个是写入数组,另一个是计算平均温度。它编译没有错误。一旦我输入我的第一个数字,应用程序就会崩溃,并且我在 stdio.h 库中收到此错误:

在 7.3.exe 中的 0x533C742E (ucrtbased.dll) 处引发异常:0xC0000005:访问冲突写入位置 0xCCCCCCCC。

我做了一个类似的没有功能的练习,效果很好。 希望你们能帮帮我。这是我的代码

#include <stdio.h>
#define MAX 7
#define _NO_CRT_STDIO_INLINE
void read(int);
float gem(int);

int main(void)
{
    float x = 0;
    int temp[MAX];
    read(temp[MAX]);
    x = gem(temp[MAX]);
    printf("%f", x);
}

void read(int k[MAX])
{
    for (int i = 1; i < 8; i++)
    {
        printf("geef de temp voor dag %d ", i);
        scanf_s("%d%*c", &k[i-1]);
    }
}

float gem(int y[MAX])
{
    int som = 0;
    float gem = 0;
    for (int i = 0; i < 8; i++)
    {
        som += y[i - 1];
        gem = som / 7;
        return gem;
    }
}

【问题讨论】:

  • y[i - 1]; 访问y[-1] if i == 0
  • 您如何以及为什么认为void read(int) 会等于void read(int k[MAX])?也许你应该退后几步,read a couple of good beginners books
  • 不相关:gem = som / 7; return gem; --> gem = som / 7.; return gem;(或gem = (double)som / MAX; return gem;)并在for循环之后移动。

标签: c arrays function-calls


【解决方案1】:

如有疑问,请检查数据类型!!

在您的代码中,函数调用

  read(temp[MAX]);   //trying to pass an int type 

错了。该函数接受int *

你需要将指针传递到数组的开头,比如

  read(temp);

也就是说,temp[MAX] 已经不匹配,导致undefined behavior

另外,您的循环控制器变量使用有点奇怪。你可以简单地使用like

  for (int i = 0; i < MAX; i++)

然后,使用i 作为迭代器(索引)。

【讨论】:

    【解决方案2】:

    在C语言中,参数一般都是按值传递的。因此,在上面的代码中,read(temp[MAX]);的值不使用函数修改。那么我们如何在另一个函数内部修改一个函数的局部变量的值。指针是解决此类问题的方法。使用指针,我们可以在另一个函数中修改一个函数的局部变量。我们只能得到使用指针的引用传递的效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多