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

C语言输入异常:混合gets与scanf导致后续输入失效

解决混合输入字符串与数值时的读取异常问题

你遇到的问题核心是**scanf和gets混合使用时的缓冲区残留问题**:

  • 当用scanf("%d")或scanf("%f")读取完学号、CGPA后,你按下的回车键(换行符\n)会留在输入缓冲区里。
  • 下一次循环调用gets时,它会直接读取这个残留的换行符,把空字符串当成姓名,导致后续的scanf直接读取你原本要输入的姓名内容,彻底打乱输入流程。
  • 另外要注意:gets函数已经被C11标准废弃,它不检查输入长度,很容易造成缓冲区溢出,绝对不要在生产代码里使用。

修正方案

  1. 用fgets替代gets读取姓名,同时手动处理fgets会读取换行符的问题
  2. 在每次scanf后,清理缓冲区里的残留换行符
  3. 优化输入提示,让用户更清楚要输入的内容

修正后的完整代码

#include <stdio.h>
#include <string.h> // 用于strcspn函数

int main()
{
    int num[3];
    float cgpa[3];
    char name[3][50];
    int count = 0, track = 0;
    
    for(count = 0; count < 3; count++){
        printf("\nEnter student %d's name: ", count+1);
        // 用fgets读取姓名,替代不安全的gets
        fgets(name[count], sizeof(name[count]), stdin);
        // 去掉fgets读取到的换行符
        name[count][strcspn(name[count], "\n")] = '\0';
        
        printf("Enter student %d's ID: ", count+1);
        scanf("%d", &num[count]);
        
        printf("Enter student %d's CGPA: ", count+1);
        scanf("%f", &cgpa[count]);
        
        // 清理scanf后缓冲区残留的换行符
        while(getchar() != '\n');
    }
    
    printf("\n--- All Students Info ---\n");
    for(count = 0; count < 3; count++){
        printf("Student %d: %s | ID: %d | CGPA: %.2f\n", 
               count+1, name[count], num[count], cgpa[count]);
    }
    
    // 找学号最大的学生
    int max_num = num[0];
    track = 0;
    for(count = 1; count < 3; count++){
        if(num[count] > max_num){
            max_num = num[count];
            track = count;
        }
    }
    
    printf("\n--- Student with Max ID ---\n");
    printf("%s | ID: %d | CGPA: %.2f\n", 
           name[track], num[track], cgpa[track]);
    
    return 0;
}

关键修改说明

  • 替换gets为fgets:fgets需要指定缓冲区大小,避免溢出,更安全。但它会把输入末尾的换行符也读进去,所以用strcspn找到换行符的位置,替换成字符串结束符\0。
  • 清理缓冲区:每次scanf后用while(getchar() != '\n');把缓冲区里剩下的字符(包括换行符)全部读完,避免影响下一次的字符串读取。
  • 优化输入提示:把姓名、学号、CGPA的输入分开提示,用户体验更好,也不容易出错。
  • 修正找最大值的逻辑:原代码里的max2变量没有实际作用,直接跟踪学号最大的索引即可,逻辑更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:54:20