C语言逐单词输入逐字符打印时while死循环问题排查
问题根因
内层while循环无法终止是两个代码错误导致的:
- 终止逻辑完全不符合需求:当前循环判断条件为
reader >= 0时持续读取,而所有常规输入内容(字母、输入完成后按回车产生的换行符\n)的ASCII值均为非负数,只有输入流结束(手动触发EOF:Windows下按Ctrl+Z、Linux/macOS下按Ctrl+D)时getchar()才会返回负值的EOF,因此循环不会在单个单词输入完成后自动停止,会一直等待后续输入。 - 变量类型不匹配:
getchar()的返回值为int类型(专门用于兼容值为-1的EOF),你用char类型存储返回值,在默认char为无符号类型的编译环境中,即使读到EOF,转换为无符号char后也会变为正值,永远满足reader >=0的条件,彻底无法触发循环终止。
修正代码
调整内层循环终止条件,读到换行符(代表当前行输入的单词结束)就退出内层循环,同时修正reader的类型为int,增加EOF兜底判断避免异常死循环:
const int amountOfInputs = 5; for (int i = 1; i <= amountOfInputs; ++i) { printf("Word Number # %d :\n", i ); int reader; while( (reader = getchar()) != '\n' && reader != EOF ) { printf("letters of word %d are: %c \n", i, reader); } // 读到EOF直接跳出外层循环,避免无意义的空转 if (reader == EOF) break; }
修正后运行逻辑:每提示输入一个单词,输入完成按回车后,会逐行打印该单词的所有字符,随后自动进入下一个单词的输入提示,完成5次输入后程序正常结束。
内容的提问来源于stack exchange,提问作者doug22
相关产品推荐
相关产品推荐

