为什么C语言fgets循环内的printf正常工作,循环外的printf无输出?
问题解答
根本原因
该现象的核心是字符串预处理逻辑仅在循环体内部执行,循环触发退出条件时这部分逻辑没有运行,具体拆解如下:
循环内第19行printf正常工作的原因
所有进入循环体的场景,都满足word[0] != '\n'的判断条件,后续会执行完整的预处理逻辑:
- 遍历字符串定位到
\n或\0的位置 - 如果是换行符就直接替换为字符串结束符
\0,如果是输入长度超出数组容量,就清空输入缓冲区剩余的内容
处理完成后word存储的是不含换行符的有效输入内容,所以打印出来是可见的正常字符串。
循环外第21行printf无可见输出的原因
while循环的退出条件为:
fgets(word, SIZE, stdin) == NULL || word[0] == '\n'
你输入空行(直接敲击回车)触发的是第二个退出条件word[0] == '\n',此时程序会直接跳出循环,完全不会执行循环体内的预处理逻辑。
此时word数组内是fgets读取到的空行原始数据:word[0] = '\n'、word[1] = '\0'。调用printf("%s", word)时,实际输出的是一个不可见的换行符,没有可显示的字符,所以会误认为没有输出。
你可以将第21行代码修改为printf("测试标记:%s结束标记", word);验证,就能看到如下输出,确认换行符确实被打印:
测试标记: 结束标记
内容的提问来源于stack exchange,提问作者oskarfightingthecode
相关产品推荐
相关产品推荐

