如何用scanf在同一行获取单个或多个输入并支持输入-1退出
解决输入单个"-1"退出程序的问题
原代码的问题在于,scanf("%d %f")要求必须输入两个值(整数+浮点数)才能成功匹配。当你只输入-1时,scanf会匹配失败,input1的取值不确定,而且输入缓冲区里的-1会一直残留,导致后续的scanf反复尝试读取都失败,程序陷入死循环。
要实现输入单个-1就退出的功能,应该先读取整行输入,判断内容是否为-1,再决定是退出还是解析两个输入值。具体实现如下:
#include <stdio.h> #include <string.h> int main() { int input1; float input2; char buffer[100]; // 定义足够大的缓冲区存储整行输入 while (1) { printf("Enter: "); // 读取整行输入,遇到EOF则退出 if (fgets(buffer, sizeof(buffer), stdin) == NULL) { break; } // 去掉末尾的换行符(如果存在) size_t len = strlen(buffer); if (len > 0 && buffer[len-1] == '\n') { buffer[len-1] = '\0'; } // 判断是否是退出指令"-1" if (strcmp(buffer, "-1") == 0) { break; } // 尝试解析整数和浮点数 if (sscanf(buffer, "%d %f", &input1, &input2) == 2) { // 这里可以添加对输入值的业务处理 printf("输入的整数:%d,浮点数:%.2f\n", input1, input2); } else { printf("输入格式错误,请输入「整数+浮点数」,或输入-1退出\n"); } } printf("程序已退出\n"); return 0; }
关键说明
fgets():一次性读取整行输入,包括空格和换行,彻底避免scanf的部分匹配、缓冲区残留问题- 去除换行符:
fgets()会把换行符也读入缓冲区,必须替换成字符串结束符\0,否则strcmp无法匹配"-1" strcmp(buffer, "-1"):严格判断输入内容是否为纯-1,确保只有输入单个-1时才触发退出sscanf()返回值:只有返回2时,说明成功解析了整数和浮点数,否则提示格式错误
内容的提问来源于stack exchange,提问作者plauwh
相关产品推荐
相关产品推荐

