我正在使用C语言编写一个程序,该程序使用文件中的数据初始化2D数组,读取数据后,我需要在2D数组中找到最大的数字并打印其值和索引。
我已成功将文件读入数组并显示了它。但是我无法获得数组的最大值。我当前的代码将最大值实际为12
时输出为434
。
我正在读取的文件称为 info.txt ,其中包含整数:
12, 31, 35, 23, 5, 43, 434, 63, 64
。它以3x3矩阵格式显示在文件中。
任何形式的帮助将不胜感激。先感谢您。
#include <stdio.h>
#include <stdlib.h>
int main() {
int arrayData[3][3];
FILE *input;
int i, j, max;
// Open the file
input = fopen("info.txt", "r");
// Read the data from the file into arrayData
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
fscanf(input, "%d\n", &arrayData[i][j]);
}
}
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
printf("%d ", arrayData[i][j]); //display the data
}
printf("\n");
}
fclose(input);
// Find the largest value, print it, and it’s indices
max = arrayData[0][0];
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
if (max < arrayData[i][j])
max = arrayData[i][j];
}
}
printf("The largest value in the array is: %d\n", max);
return 0;
}
答案 0 :(得分:1)
您的代码和问题描述中有一些问题:
fopen
是否成功打开文件。fscanf(input, "%d\n", &arrayData[i][j]);
在转换数字后将无用地扫描非空白字节。从格式字符串中删除结尾的\n
。fscanf()
的返回值和类似的函数以检测无效或丢失的输入。就您而言,它应该返回1
。如果文件中包含意外内容,例如问题文本中的逗号,则将无法正确初始化数组,并且行为未定义。这是您的代码的更正版本:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROWS 3
#define COLS 3
int main() {
int arrayData[ROWS][COLS];
FILE *input;
int i, j, max, max_i, max_j;
// Open the file
input = fopen("info.txt", "r");
if (input == NULL) {
fprintf(stderr, "cannot open file: %s\n", strerror(errno));
return 1;
}
// Read the data from the file into arrayData
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
if (fscanf(input, "%d", &arrayData[i][j]) != 1) {
fprintf(stderr, "invalid input for arrayData[%d][%d]\n", i, j);
fclose(input);
return 1;
}
}
}
fclose(input);
// Display the matrix data
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
printf("%d ", arrayData[i][j]);
}
printf("\n");
}
// Find the largest value, print it, and it’s indices
max = arrayData[max_i = 0][max_j = 0];
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
if (max < arrayData[i][j])
max = arrayData[max_i = i][max_j = j];
}
}
printf("The largest value in the array is %d at arrayData[%d][%d]\n",
max, max_i, max_j);
return 0;
}
答案 1 :(得分:-2)
实际上,您不需要将其迭代为N维数组,因为数组是连续的内存块。
int maxinarray(int *array, size_t size)
{
int max = *array++;
while(--size)
{
if(max < *array)
{
max = *array;
}
array++;
}
return max;
}
#define ROWS 3
#define COLS 3
int main()
{
int testarray[ROWS][COLS] = {{12, 31, 35}, {23, 5, 43}, {434, 63, 64}};
printf("%d\n", maxinarray((int[ROWS][COLS]){{12, 31, 35}, {23, 5, 43}, {434, 63, 64}}, ROWS * COLS));
printf("%d\n", maxinarray(testarray, ROWS * COLS));
return 0;
}