C语言 printf命令在我的程序中的特定点后不工作

5m1hhzi4  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(128)

我正在编写一个包含365个数据点的2D数组的程序,我们需要做的一件事就是找到数据的平均值,并将其打印到文件和命令窗口中。

#include <stdio.h>

#include <math.h>

void main(void) {
  char Check[32] = {
    '\0'
  };
  FILE * F = NULL;
  FILE * R;
  int ** size;
  int x[500], y[500];

  //ERROR CHECK FOR FILE
  R = fopen("results.txt", "w");
  while (F == NULL) {
    printf("What is the name of the file?\n");
    scanf("%s", & Check);
    F = fopen(Check, "r");
    if (F == NULL) {
      printf("Error: file not found\n");
    }
  }
  //READ DATA FROM FILE
  for (int i = 1; i <= 500; i++) {
    size = fscanf(F, "%d %d", & x[i], & y[i]);
    if (size == EOF) {
      break;
    } else {
      printf("Temperatures on Day %d in 1930 = %d \t 2001 = %d\n", i, x[i], y[i]);
      fprintf(R, "Temperatures on Day %d in 1930 = %d \t 2001 = %d\n", i, x[i], y[i]);
    }
  }
  fclose(R);
  printf("\n");
  //FIND MEAN OF DATA

  int sum1 = 0, sum2 = 0;

  for (int f = 0; f <= 365; f++) {
    sum1 = sum1 + size[f][0];
    sum2 = sum2 + size[f][1];
  }
  double mean1 = (double) sum1 / 365;
  double mean2 = (double) sum2 / 365;

  //PRINT TO FILE
  FILE * L;
  L = fopen("results.txt", "a");
  printf("\nThe average temperature of 1930 is: %lf\nThe average temperature of 2001 is: %.4lf", mean1, mean2);
  fprintf(L, "\nThe average temperature of 1930 is: %lf\nThe average temperature of 2001 is: %.4lf", mean1, mean2);

}

然而,我已经构建了几次代码,当我运行它时,程序不会将平均值打印到命令窗口。它只是不会执行之后的任何代码,而且它也不会将我想要的语句放入我创建的文件中。我已经附加了一个图像,说明我的程序在运行时会做什么。除了完成数据循环后的一个小延迟外,它似乎运行得很好。我试着在网上寻找解决方案,但我发现似乎对我的问题没有任何帮助。我已经多次重建程序,而且还多次关闭和启动了Geany(我使用的软件)。如果有帮助的话,我的代码保存在一个.C文件中。
enter image description here

uxh89sit

uxh89sit1#

此scanf调用的第二个参数表达式

scanf("%s", & Check);

的类型无效。相反,您需要编写

scanf("%s", Check);

数组x和y的有效索引范围如下声明

int x[500], y[500];

[0, 500)
所以这个for循环

for (int i = 1; i <= 500; i++) {

可以调用未定义的行为。
声明为具有指针类型的变量size

int ** size;

所以在这些陈述中使用它

size = fscanf(F, "%d %d", & x[i], & y[i]);
if (size == EOF) {

没有意义。函数fscanf的返回类型是int。函数声明如下

int fscanf(FILE * restrict stream, const char * restrict format, ..);

在for循环之后,指针的值将为EOF或值2(假设代码将被编译)。

for (int f = 0; f <= 365; f++) {
  sum1 = sum1 + size[f][0];
  sum2 = sum2 + size[f][1];
}

调用未定义的行为。

41zrol4v

41zrol4v2#

很难理解size的用法。它被声明为int **,但是,赋值是size = fscanf(F, "%d %d", & x[i], & y[i]);。那么在第一个for循环结束后,size应该是EOF。然后在第二个for循环中取消引用它将导致未定义的行为,从而中止程序。在我看来,你应该使用数组x[]y[]来计算均值。而且,第一个循环是[1..500],第二个是[0..365],即使你使用x[]y[]来计算均值,因为两个数组都没有初始化,访问x[0]y[0]将产生垃圾值,导致错误的结果。

相关问题