为何我的C程序无法输入变量b?输入流程异常求助
问题:scanf输入整数后,gets被跳过无法输入字符串变量
问题描述
想要输入int类型变量a和字符串变量b,但运行程序时,输入a的数值后,程序直接跳过b的输入提示和gets()调用,最终输出中b为空。
原代码
#include<stdio.h> int main() { int a; char b[5]; printf("Write a:\n"); scanf("%i", &a); printf("Write b:\n"); gets(b); printf("a = %i, b = %s", a, b); return 0; }
(注:原代码中#include<stdio>>是笔误,正确应为#include<stdio.h>)
程序输出
a = (输入的数值), b =
问题原因
scanf("%i", &a)读取整数时,只会读取输入中的数字部分,当你输入完数字按回车后,这个回车对应的换行符\n会留在输入缓冲区中。而gets()函数的行为是从缓冲区读取内容,直到遇到换行符就停止读取,所以它会直接把这个残留的换行符当成输入,导致b被赋值为空字符串,看起来像是跳过了输入步骤。
另外要注意:gets()是C标准已经废弃的不安全函数,它不检查输入长度,一旦输入超过数组b的大小,会导致缓冲区溢出,引发程序崩溃或安全问题。
解决方法
方法1:处理缓冲区残留换行符,改用安全的fgets
#include<stdio.h> #include<string.h> // 需要strcspn函数的头文件 int main() { int a; char b[5]; printf("Write a:\n"); scanf("%i", &a); getchar(); // 吃掉输入a后残留的换行符 printf("Write b:\n"); fgets(b, sizeof(b), stdin); // 替代gets,指定读取长度避免溢出 b[strcspn(b, "\n")] = '\0'; // 去掉fgets读取到的换行符 printf("a = %i, b = %s", a, b); return 0; }
说明:strcspn(b, "\n")会返回字符串b中第一个换行符的位置,将该位置替换为字符串结束符\0,避免输出时带多余换行。
方法2:直接用scanf读取字符串(适合无空格的输入)
#include<stdio.h> int main() { int a; char b[5]; printf("Write a:\n"); scanf("%i", &a); printf("Write b:\n"); scanf("%4s", b); // %4s限制最多读4个字符,留1位存'\0' printf("a = %i, b = %s", a, b); return 0; }
说明:scanf("%s")会自动跳过前面的空白字符(包括换行符),所以不需要额外处理缓冲区,但它会在遇到空格、换行时停止读取,无法输入带空格的字符串。
关键注意点
- 禁止使用
gets(),优先用fgets()替代,确保输入不会溢出数组。 - 用
fgets()时必须处理读取到的换行符,否则会影响后续输出或逻辑。
内容的提问来源于stack exchange,提问作者moyoloco09
相关产品推荐
相关产品推荐

