输入非整数时D语言程序中readf引发死循环的原因?
输入非整数时程序陷入无限循环的原因分析
嘿,这个问题我之前也碰到过,核心原因是输入缓冲区残留的错误数据没被清理,再加上格式符使用不当,才导致了无限循环,咱们一步步拆解:
1. 格式符的误用埋下隐患
你代码里写的是readf(" %s", inputInt);,但inputInt是uint类型,%s是D语言里用于读取字符串的格式说明符,正确读取无符号整数应该用%u(或者%d也能兼容,但%u更匹配uint类型)。虽然这不是无限循环的直接原因,但会让解析失败的情况更直接。
2. 输入缓冲区残留数据触发无限循环
当你输入'a'后,这个字符会留在输入缓冲区里。第一次调用readf时,它尝试把'a'解析成uint,失败后抛出异常进入catch块——你在这里把inputInt设为1,让循环继续执行,但缓冲区里的'a'压根没被处理。
下一次循环执行readf时,它会直接读取缓冲区里残留的'a',再次解析失败抛出异常,就这样周而复始,程序根本不会等待新的输入,直接陷入异常循环。
修复方案
要解决这个问题,关键是在catch块里清空输入缓冲区,把残留的错误数据(包括换行符)都读走,确保下一次readf能获取用户的新输入。修改后的代码如下:
uint inputInt = 1; while (inputInt > 0) { write("enter something: "); try { readf(" %u", inputInt); // 改用匹配uint的格式符%u writefln("inputInt is: %s", inputInt); } catch (Exception ex) { writeln("does not compute, try again."); inputInt = 1; // 清空输入缓冲区,读取并丢弃剩余内容 string dummy; readln(dummy); } }
这样每次解析失败后,缓冲区里的错误数据都会被readln读取并丢弃,下一次循环就会正常等待用户输入了。
内容的提问来源于stack exchange,提问作者Aaron Thomas
相关产品推荐
相关产品推荐

