提问人:Robert Westmeyer 提问时间:4/3/2023 最后编辑:Vlad from MoscowRobert Westmeyer 更新时间:4/3/2023 访问量:47
printf 命令在我的程序中的特定点后不起作用
printf command not working after a specific point in my program
问:
我正在开发一个包含 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 文件中。
答:
此调用 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) {
没有意义。该函数的返回类型为 。该函数的声明如下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];
}
调用未定义的行为。
评论
很难遵循 的用法。它被声明为 ,但是,赋值是 。然后应该在第一个 for 循环结束后。然后在第二个 for 循环中取消引用它将导致未定义的行为,从而中止程序。
在我看来,您应该使用数组并计算平均值。
此外,第一个循环是 [1..500],第二个循环是 [0..365],即使你使用 和 来计算平均值,因为两个数组都没有初始化,访问并会产生垃圾值,导致错误的结果。size
int **
size = fscanf(F, "%d %d", & x[i], & y[i]);
size
EOF
x[]
y[]
x[]
y[]
x[0]
y[0]
评论
int ** size;
为什么 size 是指向 int 的指针? 那应该做什么?你读了你所有的数字,但你没有根据它们计算总和。 对我来说更有意义。事实上,我希望您的程序在您尝试访问时生成分段错误,因为现在设置为 .你的编译器(gcc?)应该警告你。如果您的代码在编译时生成警告,您可以修复它们。sum1 = sum1 + size[f][0]
x
y
sum1 += x[f]
size[f][0]
size
EOF