C语言不使用数组读取未知数量整数并即时打印的问题求解
问题解答
输入输出混杂的原因与解决
你遇到的输入输出穿插问题根源是终端默认行缓冲规则:Unix类系统的终端默认开启行缓冲,标准输入会等到用户输入换行符\n或者缓冲区满之后,才会把缓冲区内的内容交给程序处理。所以你每输完一行按回车,scanf才会批量读取这一行的所有整数,批量打印输出,自然就和下一行的输入内容混在一起。
两种解决思路:
- 常规最优方案:输入结束后统一输出所有整数。不需要修改终端配置,完全符合常规使用逻辑,不会出现输入输出混杂的问题,适配所有场景。
- 实时打印方案:如果确实要求读取到一个数就立刻打印,需要修改终端为无缓冲模式,但是会影响终端默认交互行为(比如退格键失效、输入不会回显等),非特殊需求不推荐。
避免末尾多余逗号的最优方案
不需要数组存储,只需要新增一个标记位判断是否为第一个输出的整数即可,空间复杂度为O(1):
- 定义初始值为1的标记位
first_flag,标记当前要输出的是不是第一个整数 - 如果是第一个数:直接打印数字本身,把标记位改为0
- 如果不是第一个数:先打印
,再打印数字
这种写法永远不会在最后一个数后面多打印逗号,完全符合输出要求。
完整可运行参考代码(常规方案,无需修改终端)
#include <stdio.h> int main() { int number; int first_flag = 1; // 注意scanf返回值为成功读取的元素个数,读到EOF返回-1,必须判断等于1才是正常读取到整数 // 原写法while(scanf("%d", &number))存在隐患:读到EOF返回-1时布尔判断为真,会进入循环打印脏数据 while (scanf("%d", &number) == 1) { if (first_flag) { printf("%d", number); first_flag = 0; } else { printf(", %d", number); } } // 输出结束补换行优化格式 putchar('\n'); return 0; }
该代码优势:
- 无需数组存储,内存占用固定,无论输入多少整数都不会溢出
- 自动适配空格、换行、制表符等任意空白分隔符
- 输出完全符合示例要求,无多余逗号
- 所有输出在按下Ctrl-D结束输入后统一打印,不会出现输入输出混杂问题
内容的提问来源于stack exchange,提问作者Angra Mainyu
相关产品推荐
相关产品推荐

