在switch语句或循环中获取含空格输入字符串,测试代码遇问题
搞定fgets读取名字时的坑
嘿,我猜你这段代码放到main里运行时,大概率遇到了「还没来得及输入名字,程序就直接跳过输入步骤」的情况吧?毕竟这是用fgets读取带空格字符串时的高频坑,我来给你捋清楚怎么解决。
首先说问题根源:如果你的main函数里在这段代码之前用过scanf(比如读年龄、学号这类),scanf只会读取你输入的有效内容,把末尾的换行符留在了输入缓冲区里。等fgets执行时,它会直接把这个残留的换行符当成输入,导致看起来像是跳过了输入。另外,你的代码里用到了MAX但没提前定义,编译器也会直接报错,这个细节可不能漏。
两种修复方案任你选
方案1:先清空缓冲区残留的换行
在调用fgets之前,把缓冲区里剩下的字符全部读走,彻底清理残留:
#include <stdio.h> #include <string.h> #define MAX 15 // 必须提前定义MAX宏! int main() { // 举个例子:如果之前用了scanf读取其他内容 int age; printf("先输入你的年龄:"); scanf("%d", &age); // 关键步骤:清空缓冲区里的残留换行符 while (getchar() != '\n'); char name[MAX]; printf("What is your name? "); fgets(name, MAX, stdin); // 去掉末尾的换行符(如果存在) if ((strlen(name) > 0) && (name[strlen(name) - 1] == '\n')) name[strlen(name) - 1] = '\0'; printf("Hello %s. Nice to meet you.\n", name); return 0; }
方案2:全程用fgets读取,更安全
如果要读取多种类型的输入,全程用fgets读入缓冲区,再用sscanf转换格式,从根源避免缓冲区残留问题:
#include <stdio.h> #include <string.h> #define MAX 15 #define BUFFER_LEN 256 int main() { char temp_buf[BUFFER_LEN]; int age; printf("先输入你的年龄:"); fgets(temp_buf, BUFFER_LEN, stdin); sscanf(temp_buf, "%d", &age); // 将读取到的字符串转换为整数 char name[MAX]; printf("What is your name? "); fgets(name, MAX, stdin); if ((strlen(name) > 0) && (name[strlen(name) - 1] == '\n')) name[strlen(name) - 1] = '\0'; printf("Hello %s. Nice to meet you.\n", name); return 0; }
小提醒
如果你的main函数里完全没用到其他输入函数还是出问题,那可以检查下是不是终端输入流的异常,重启终端试试基本就能解决。
内容的提问来源于stack exchange,提问作者codergirrl
相关产品推荐
相关产品推荐

