鱼C论坛

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

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

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

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

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

x
  1. #include <stdio.h>

  2. #define MAX 1024

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

  6.         return 0;
  7. }
复制代码


@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()函数逐行读取输入,并将每行的内容分别存储到数组中的每个元素。

下面是一个示例代码:

  1. #include <stdio.h>

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

  5. int main() {
  6.     char array[ROW][COLUMN];
  7.     char temp[MAX_LENGTH];

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

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

  21.     return 0;
  22. }
复制代码


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

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

使用道具 举报

发表于 2024-3-20 13:21:18 | 显示全部楼层    本楼为最佳答案   
fgets()函数可以读取一维字符数组(也就是字符串),而不能直接读取二维数组。这是因为fgets()函数是按行读取输入,将每行的内容存储到一个字符串中,然后将字符串复制到数组中存储。

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

下面是一个示例代码:

  1. #include <stdio.h>

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

  5. int main() {
  6.     char array[ROW][COLUMN];
  7.     char temp[MAX_LENGTH];

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

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

  21.     return 0;
  22. }
复制代码


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

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

使用道具 举报

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

@FishC, *(pos + j)  与 pos[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)也表示的是数组的第二个元素的值,依此类推。

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

  1. #include <stdio.h>

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

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

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

  9.     return 0;
  10. }
复制代码


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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 15:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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