C++使用char数组校验客户号时输入过长触发while无限循环问题
无限循环问题触发原因
核心原因是输入流错误和缓冲区残留数据共同导致的,具体触发逻辑如下:
- 首先,
cin.getline的读取规则触发了流错误:你定义的数组长度SIZE=8,cin.getline(customerNum, SIZE)最多只会读取7个有效字符存储到数组中,最后1位留给字符串结束符\0。当你输入的内容长度≥8时(比如示例中的12345678加换行),getline只会读取前7个字符到数组,剩余的第8个字符和末尾的换行符都会残留在输入缓冲区中。同时C++标准规定,当getline因为输入长度超过限制而无法读取完整行时,会自动将输入流cin的failbit错误标记置位。 - 其次,流错误状态会导致后续输入操作失效:一旦
cin的failbit被置位,所有后续的cin相关操作都会直接返回失败,不会再阻塞等待用户输入新的内容。 - 最后循环逻辑形成闭环:每次循环调用
testNum校验残留的旧输入都会返回false,同时cin.getline无法读取新输入也不会清空缓冲区,程序就会一直重复校验旧数据、输出错误提示的流程,进入无限循环。
内容的提问来源于stack exchange,提问作者King Kampung
相关产品推荐
相关产品推荐

