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

使用指针实现的学生信息录入函数中姓名输入被跳过的问题求助

解决scanf读取姓名后跳过后续输入的问题(保留指针实现)

你的问题根源是输入缓冲区残留的换行符:当用scanf("%[^\n]s", ...)读取第一个学生姓名(输入后按回车),%[^\n]会读取换行符前的所有字符,但换行符\n会留在输入缓冲区。下一次循环执行scanf("%[^\n]s")时,这个换行符会被直接读取,%[^\n]遇到换行符就停止,导致姓名被读取为空,程序直接进入成绩输入环节。

另外注意:原代码中的%[^\n]s是错误写法,%[]是独立的格式说明符,不需要后缀s;同时必须添加长度限制,避免缓冲区溢出。


修复方案

1. 核心修改:修正scanf格式并清除缓冲区空白

在读取姓名的scanf格式字符串前添加一个空格(自动跳过所有空白字符,包括残留的换行),同时修正格式符并添加长度限制:

scanf(" %NAME_MAX[^\n]", *(pnames + i));

2. 完整修改后的insert_data函数(保留指针实现)

void insert_data(char (*pnames)[NAME_MAX], int (*pscore)[MAX_SCORES]) {
    int i, j;
    // 录入数据
    for (i = 0; i < MAX_STUDENTS; i++){
        printf("Enter student %d name:", i + 1);
        // 前置空格跳过空白,%NAME_MAX[^\n]限制读取长度防止溢出
        scanf(" %NAME_MAX[^\n]", *(pnames + i));

        for (j = 0; j < MAX_SCORES; j++) {
            printf("Enter student %d score: ", (i + 1));
            scanf("%d", *(pscore + i) + j);
            printf("%d\n",*(*(pscore + i) + j) );
        }
    }    
    // 打印表格
    for (i = 0; i < MAX_STUDENTS; i++) {
        printf("%s: \t\t",*(pnames + i));
        for (j = 0; j < MAX_SCORES; j++) {
            printf("%d \t",*(*(pscore + i) + j));
        }
        printf("\n");
    }
}

3. 关于fgets的补充说明

如果你之前尝试fgets未成功,是因为fgets会把换行符读入字符串,需要手动去除,同时也要先清除缓冲区残留的换行:

// 先清除缓冲区残留的换行
while (getchar() != '\n');
// 读取姓名
fgets(*(pnames + i), NAME_MAX, stdin);
// 去掉字符串末尾的换行符
(*(pnames + i))[strcspn(*(pnames + i), "\n")] = '\0';

但此方案需要额外处理缓冲区,不如修改后的scanf贴合你原有的代码逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:45:37