You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言调用void函数后如何存储用户输入并实现跨函数读取数据

实现跨函数访问用户数据的修改方案

核心原理

函数内部定义的局部变量仅在函数执行期间有效,函数执行结束后内存会被回收,无法被其他函数访问。要实现跨函数共享数据,将存储用户信息的变量定义在所有函数外部的全局作用域即可。

修改步骤

  1. 首先在代码顶部定义全局存储结构,支持存储多条用户记录:
#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();
  1. 修改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");
}
  1. 修改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);
    }
}
  1. main函数保持原有逻辑即可正常运行。

原代码已知问题修正说明

  • 原addUsers函数中fgets的第二个参数size未定义,替换为全局定义的INFO_LENGTH常量
  • 修复scanf读取操作选项后,输入缓冲区残留换行导致fgets首次读取为空的问题
  • 新增多用户存储支持,可连续录入多个用户后统一查询

内容的提问来源于stack exchange,提问作者solace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:45:03