鱼C论坛

 找回密码
 立即注册
查看: 655|回复: 3

[已解决]C语言 fgets函数与二维数组

[复制链接]
发表于 2024-3-20 13:20:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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[0][3]' 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.
最佳答案
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[ROW][COLUMN];
    char temp[MAX_LENGTH];

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

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

    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[ROW][COLUMN];
    char temp[MAX_LENGTH];

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

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

    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-23 10:55:18 | 显示全部楼层
FishC 发表于 2024-3-20 13:21
fgets()函数可以读取一维字符数组(也就是字符串),而不能直接读取二维数组。这是因为fgets()函数是按行读 ...

@FishC, *(pos[i] + j)  与 pos[i][j] 等价吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-23 10:55:37 | 显示全部楼层
liyifeng295641 发表于 2024-03-23 10:55
@FishC, *(pos + j)  与 pos 等价吗?


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

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

下面是一个示例代码来演示这个概念:
#include <stdio.h>

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

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

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

    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 05:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表