printf 命令在我的程序中的特定点后不起作用

printf command not working after a specific point in my program

提问人:Robert Westmeyer 提问时间:4/3/2023 最后编辑:Vlad from MoscowRobert Westmeyer 更新时间:4/3/2023 访问量:47

问:

我正在开发一个包含 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 文件中。

在此处输入图像描述

C 文件 文件-IO 扫描 未定义行为

评论

0赞 erik258 4/3/2023
int ** size;为什么 size 是指向 int 的指针? 那应该做什么?你读了你所有的数字,但你没有根据它们计算总和。 对我来说更有意义。事实上,我希望您的程序在您尝试访问时生成分段错误,因为现在设置为 .你的编译器(gcc?)应该警告你。如果您的代码在编译时生成警告,您可以修复它们。sum1 = sum1 + size[f][0]xysum1 += x[f]size[f][0]sizeEOF
0赞 Zwy 4/3/2023
该映像指示操作系统是 windows,因此编译器可能不是 gcc。

答:

0赞 Vlad from Moscow 4/3/2023 #1

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

scanf("%s", & Check);

具有无效的类型。相反,你需要写

scanf("%s", Check);

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

int x[500], y[500];

是。[0, 500)

所以这个for循环

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

可以调用未定义的行为。

声明为具有指针类型的变量大小

int ** size;

所以在这些语句中使用它

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

没有意义。该函数的返回类型为 。该函数的声明如下fscanfint

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];
}

调用未定义的行为。

评论

0赞 Robert Westmeyer 4/3/2023
那么我应该怎么做才能修复这些未定义的行为呢?因为对于我的 sum1=sum1+size[f][0] 代码,除非我将 size 变量设为指针,否则该代码将不起作用
0赞 Vlad from Moscow 4/3/2023
@RobertWestmeyer 读取数组 x 和 y 中的数据。你需要在这个 for 循环中使用它们 for (int f = 0; f <= 365; f++) { sum1 = sum1 + size[f][0]; sum2 = sum2 + size[f][1]; } 而不是变量大小。使用指针大小没有意义。
0赞 Zwy 4/3/2023 #2

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