C语言如何实现接收多格式合法用户输入并完成正确性校验
C语言多格式输入匹配解决方案
问题根源
你现有代码的核心问题是连续调用了两次scanf:第一个scanf读取第一次输入的内容后,第二个scanf仍会执行并等待新的输入,因此会出现需要输入两次才能输出结果的问题。同时原有逻辑没有覆盖第三个参数为浮点数的场景,也无法匹配Sarah 6 7.5这类合法输入。
实现方案
推荐先读取完整一行输入再做解析,避免scanf缓冲区残留或等待额外输入的问题,代码如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> int main() { char input_buf[128]; char name[10]; int num1; float num2; int parse_ret; // 读取整行输入 if (fgets(input_buf, sizeof(input_buf), stdin) == NULL) { printf("Failure"); return 0; } // 解析输入内容,%f可同时兼容int和float类型的第三个参数 parse_ret = sscanf(input_buf, "%s %d %f", name, &num1, &num2); if (parse_ret == 2 || parse_ret == 3) { printf("Pass"); // 如需区分第三个参数类型可添加以下逻辑 // if (parse_ret == 3) { // if (num2 == (int)num2) { // int num2_int = (int)num2; // // 处理整数场景 // } else { // // 处理浮点数场景 // } // } } else { printf("Failure"); } return 0; }
逻辑说明
fgets会一次性读取用户输入的整行内容,不会等待额外输入,也不会留下输入缓冲区残留sscanf对内存中存储的输入行做解析,通过返回值判断匹配情况:- 返回2:成功匹配字符串+整数的第一种格式
- 返回3:成功匹配字符串+整数+数值(整数/浮点数均可)的第二种格式
- 其他返回值均判定为非法输入
该方案可正确匹配你给出的所有合法输入示例,输入任意合法内容后按回车即可直接输出结果。
内容的提问来源于stack exchange,提问作者brisharpiro
相关产品推荐
相关产品推荐

