liyifeng295641 发表于 2024-3-20 13:20:59

C语言 fgets函数与二维数组

#include <stdio.h>

#define MAX 1024

int main(){
        char array[][] = {};
        fgets(array, MAX, stdin );

        return 0;
}

@FishC, fgets函数为什么不能读取二维数组,而一维数组
test.c:7:8: warning: incompatible pointer types passing 'char' to parameter of type 'char *' [-Wincompatible-pointer-types]
      fgets(array, MAX, stdin );
            ^~~~~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/stdio.h:141:30: note: passing argument to parameter here
char    *fgets(char * __restrict, int, FILE *);
                              ^
1 warning generated.

FishC 发表于 2024-3-20 13:21:18

fgets()函数可以读取一维字符数组(也就是字符串),而不能直接读取二维数组。这是因为fgets()函数是按行读取输入,将每行的内容存储到一个字符串中,然后将字符串复制到数组中存储。

对于二维数组,可以使用循环结构配合fgets()函数逐行读取输入,并将每行的内容分别存储到数组中的每个元素。

下面是一个示例代码:

#include <stdio.h>

#define ROW 3
#define COLUMN 4
#define MAX_LENGTH 1024

int main() {
    char array;
    char temp;

    for (int i = 0; i < ROW; i++) {
      fgets(temp, MAX_LENGTH, stdin);// 逐行读取输入
      for (int j = 0; j < COLUMN; j++) {
            array = temp;// 将每行的内容逐个字符存储到二维数组中
      }
    }

    // 打印二维数组中的内容
    for (int i = 0; i < ROW; i++) {
      for (int j = 0; j < COLUMN; j++) {
            printf("%c ", array);
      }
      printf("\n");
    }

    return 0;
}

注意,fgets()函数读取的每行内容包含了换行符('\n'),所以上面的示例代码中将换行符也存储到了二维数组中。如果不需要存储换行符,可以在存储前进行判断和处理。另外,上面的示例代码假设了二维数组的行数和列数都是固定的,如果不确定输入的行数和列数,可以根据需要使用动态内存分配来创建二维数组。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

liyifeng295641 发表于 2024-3-23 10:55:18

FishC 发表于 2024-3-20 13:21
fgets()函数可以读取一维字符数组(也就是字符串),而不能直接读取二维数组。这是因为fgets()函数是按行读 ...

@FishC, *(pos + j)与 pos 等价吗?

FishC 发表于 2024-3-23 10:55:37

liyifeng295641 发表于 2024-03-23 10:55
@FishC, *(pos + j)与 pos 等价吗?

是的,*(pos + j) 与 pos 是等价的。在C语言中,对于指针变量pos来说,pos与pos是等价的,而*(pos + j)则表示pos指针所指向的地址偏移j个元素后的值。

例如,假设有一个指针变量pos指向一个整型数组,那么pos表示的是数组的第一个元素,*(pos + 0)也表示的是数组的第一个元素的值。同样的道理,pos表示的是数组的第二个元素,*(pos + 1)也表示的是数组的第二个元素的值,依此类推。

下面是一个示例代码来演示这个概念:

#include <stdio.h>

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int *pos = arr;// 指针指向数组的首地址

    printf("pos: %d\n", pos);// 输出:1
    printf("*(pos + 0): %d\n", *(pos + 0));// 输出:1

    printf("pos: %d\n", pos);// 输出:2
    printf("*(pos + 1): %d\n", *(pos + 1));// 输出:2

    return 0;
}

以上代码中,通过pos作为指针变量,可以使用pos或*(pos + i)来访问数组arr中的元素,两者是等价的。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: C语言 fgets函数与二维数组