C语言使用scanf、fgets读取输入时跳过输入步骤的问题求助
问题根因
- C语言的标准输入函数会共用输入缓冲区,使用
scanf读取%d、%lf、%s这类格式内容时,仅会读取匹配的目标内容,输入完成后按下的换行符\n会残留在缓冲区中。 %c格式符、fgets函数不会自动跳过缓冲区开头的空白字符(含换行、空格、制表符),会直接读取残留的\n作为输入内容,因此表现为直接跳过输入环节。
修复方案
只需要针对两处输入位置做调整即可:
- 读取grade的
scanf格式串中,在%c前添加一个空格,该空格会指示scanf自动跳过所有前置空白字符,避免读取残留换行:
将scanf("%c", &grade);修改为scanf(" %c", &grade); - 读取完name后,先调用一次
getchar()吃掉scanf("%s")残留的换行符,再调用fgets读取全名:
在scanf("%s", name);后新增一行getchar();
修改后完整代码
#include <stdlib.h> #include <stdio.h> int main() { int age; printf("Enter your age: "); scanf("%d", &age); printf("You are %d years old\n", age); double gpa; printf("Enter your GPA: "); scanf("%lf", &gpa); printf("Your GPA is %f\n", gpa); char grade; printf("Enter your Grade: "); scanf(" %c", &grade); // %c前加空格跳过前置空白字符 printf("Your Grade is %c\n", grade); char name[20]; printf("Enter your Name: "); scanf("%s", name); getchar(); // 吃掉scanf("%s")残留的换行符 printf("Your name is %s\n", name); char fullname[20]; printf("Enter your full name: "); fgets(fullname, 20, stdin); printf("Your full name is %s\n", fullname); return 0; }
补充说明
如果存在输入内容超过变量长度的场景,残留的内容可能不止一个换行符,可以用循环清空缓冲区的方式处理,替代单条getchar():
int c; while((c = getchar()) != '\n' && c != EOF);
该代码会一直读取缓冲区内容直到遇到换行或输入结束,彻底清空残留内容。
内容的提问来源于stack exchange,提问作者ye west
相关产品推荐
相关产品推荐

