C语言调用void函数后如何存储用户输入并实现跨函数读取数据
实现跨函数访问用户数据的修改方案
核心原理
函数内部定义的局部变量仅在函数执行期间有效,函数执行结束后内存会被回收,无法被其他函数访问。要实现跨函数共享数据,将存储用户信息的变量定义在所有函数外部的全局作用域即可。
修改步骤
- 首先在代码顶部定义全局存储结构,支持存储多条用户记录:
#include <stdio.h> #include <string.h> #define MAX_USER_NUM 100 // 最多存储的用户总数 #define INFO_LENGTH 100 // 姓名/班级字段的最大长度 // 定义单个用户的信息结构体 typedef struct { char userName[INFO_LENGTH]; char className[INFO_LENGTH]; } User; // 全局变量:所有函数都可直接访问 User userList[MAX_USER_NUM]; // 存储所有用户的数组 int currentUserCount = 0; // 记录已录入的用户数量 // 函数前置声明,避免main函数调用时识别不到 void addUsers(); void listUsers();
- 修改
addUsers函数,将录入数据存入全局数组,同时修复原代码输入缓冲区残留换行的问题:
void addUsers(){ if(currentUserCount >= MAX_USER_NUM){ printf("用户存储上限已达,无法继续添加\n"); return; } // 清空scanf读取选择后残留在输入缓冲区的换行符,避免fgets读取空内容 while(getchar() != '\n'); printf("Enter user name\n"); fgets(userList[currentUserCount].userName, INFO_LENGTH, stdin); printf("Enter className:\n"); fgets(userList[currentUserCount].className, INFO_LENGTH, stdin); currentUserCount++; printf("User added\n"); }
- 修改
listUsers函数,直接读取全局数组输出内容:
void listUsers(){ if(currentUserCount == 0){ printf("empty\n"); return; } for(int i = 0; i < currentUserCount; i++){ printf("第%d个用户:你的姓名是%s,你的班级是%s", i+1, userList[i].userName, userList[i].className); } }
- main函数保持原有逻辑即可正常运行。
原代码已知问题修正说明
- 原
addUsers函数中fgets的第二个参数size未定义,替换为全局定义的INFO_LENGTH常量 - 修复scanf读取操作选项后,输入缓冲区残留换行导致fgets首次读取为空的问题
- 新增多用户存储支持,可连续录入多个用户后统一查询
内容的提问来源于stack exchange,提问作者solace
相关产品推荐
相关产品推荐

