要求正整数的递归输入验证函数输入负整数时失效求助
问题分析与解决
问题原因
当输入负整数时,scanf(" %d%c", &input, &term)会正常读取负整数到input,同时把换行符读入term,此时input < 0的条件成立,进入if分支。但此时输入缓冲区里已经没有剩余的非换行字符了,执行scanf("%*[^\n]")时,这个指令要求读取并丢弃所有非换行字符,可缓冲区里只剩换行符,它就会一直等待新输入,导致程序卡住。
修复方案
方案1:调整缓冲区清理逻辑
拆分判断条件,只在输入格式错误(比如输入字母、小数)时清理缓冲区,输入负整数时无需额外清理:
int get_num_order(){ char term; int input; printf("Please enter the number of items you want to order: "); int scan_result = scanf(" %d%c", &input, &term); // 先判断输入格式是否合法(是否读取到完整整数+换行) if(scan_result != 2 || term != '\n'){ // 清理缓冲区剩余的非法内容 scanf("%*[^\n]"); return get_num_order(); } // 格式合法的情况下,再判断是否为非负整数 else if(input < 0){ // 此时缓冲区已空,无需清理 return get_num_order(); } else{ return input; } }
方案2:改用fgets+sscanf更健壮的输入方式
scanf处理缓冲区容易出问题,改用整行读取再解析的方式,逻辑更清晰:
#include <stdio.h> #include <string.h> int get_num_order(){ char buffer[100]; int input; printf("Please enter the number of items you want to order: "); // 读取整行输入 if(fgets(buffer, sizeof(buffer), stdin) == NULL){ return get_num_order(); } // 去掉换行符(如果存在) buffer[strcspn(buffer, "\n")] = '\0'; // 解析整数并判断是否为非负 if(sscanf(buffer, "%d", &input) != 1 || input < 0){ return get_num_order(); } else{ return input; } }
补充说明
- 方案1保留了原有的递归逻辑,仅调整了判断顺序,避免了不必要的缓冲区等待;
- 方案2彻底规避了
scanf的缓冲区问题,能处理更多异常输入场景,推荐优先使用。
内容的提问来源于stack exchange,提问作者PythonHacks999
相关产品推荐
相关产品推荐

