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

如何组合使用fgets()和sscanf()读取换行分隔的玩家信息输入

基于fgets+sscanf的分行玩家信息读取实现

实现逻辑说明

需求是按行采集三类玩家信息:姓名(字符串)、身高(数值型)、年龄(整型),用户每完成一项输入按回车,三个输入各占一行,组合用fgets()逐行读入、sscanf()从行字符串解析对应类型值即可,核心注意点如下:

  • fgets()单次调用仅能读取一行内容,会自动将行尾的换行符\n读入缓冲区,需要手动处理避免字符串带多余换行
  • 每一步读取、解析都要做合法性校验,避免输入错误导致程序逻辑异常
  • 要处理输入超长的边界情况,防止残留输入流的内容打乱后续读取顺序
  • 姓名字段单独占一行,支持输入带空格的姓名(比如“张 三”这类格式)

完整可运行代码

#include <stdio.h>
#include <string.h>

// 定义缓冲区长度常量,避免硬编码
#define MAX_NAME_LEN 50
#define LINE_BUF_LEN 64

int main() {
    char player_name[MAX_NAME_LEN];
    float player_height;
    int player_age;
    char line_buf[LINE_BUF_LEN];
    char *newline_ptr;

    // 保留原有提示语句,补充换行优化展示效果
    printf("Please enter Name, Height and Age of Player\n");

    // 读取第一行:玩家姓名
    printf("请输入姓名:");
    if (fgets(line_buf, sizeof(line_buf), stdin) == NULL) {
        printf("读取输入异常,程序退出\n");
        return 1;
    }
    // 替换行尾换行符为字符串结束符
    newline_ptr = strchr(line_buf, '\n');
    if (newline_ptr != NULL) {
        *newline_ptr = '\0';
    } else {
        // 输入超长时清空输入流残留内容
        while (getchar() != '\n');
    }
    // 拷贝姓名到专属变量,避免缓冲区被后续读取覆盖
    strncpy(player_name, line_buf, MAX_NAME_LEN - 1);
    player_name[MAX_NAME_LEN - 1] = '\0';

    // 读取第二行:玩家身高
    printf("请输入身高(单位:米):");
    if (fgets(line_buf, sizeof(line_buf), stdin) == NULL) {
        printf("读取输入异常,程序退出\n");
        return 1;
    }
    // 用sscanf从行内容解析浮点型身高,校验解析结果
    if (sscanf(line_buf, "%f", &player_height) != 1) {
        printf("身高输入格式错误,请输入有效数值\n");
        return 1;
    }

    // 读取第三行:玩家年龄
    printf("请输入年龄:");
    if (fgets(line_buf, sizeof(line_buf), stdin) == NULL) {
        printf("读取输入异常,程序退出\n");
        return 1;
    }
    // 用sscanf解析整型年龄,校验解析结果
    if (sscanf(line_buf, "%d", &player_age) != 1) {
        printf("年龄输入格式错误,请输入有效整数\n");
        return 1;
    }

    // 输出采集结果做校验
    printf("\n=== 玩家信息采集完成 ===\n");
    printf("姓名:%s\n", player_name);
    printf("身高:%.2f米\n", player_height);
    printf("年龄:%d岁\n", player_age);

    return 0;
}

常见坑点说明

  • 不要尝试单次fgets读完整三行内容:用户每输一项按回车,输入流里是三个被\n分隔的段,单次fgets遇到第一个\n就会停止读取,剩下的内容会留到后续读取时错位。
  • 不要省略换行符处理:如果不把读入的行尾\n替换掉,姓名字段末尾会自带换行,打印或者后续存储时会出现格式错乱。
  • 不要省略超长输入处理:如果用户输入的内容超过缓冲区长度,没被读走的内容会留在输入流里,被下一次fgets直接读走,导致后续的身高、年龄读取到上一次输入的残留内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:06:19