传入数组指针的C语言while循环仅执行一次,为何后续无法打印?
问题原因分析
你的代码出现后续循环无法打印字符的问题,核心有两个关键原因:
1. 标准输出缓冲区未触发刷新
printboard函数里的printf没有输出换行符(\n),C语言中标准输出默认是行缓冲模式——只有遇到换行符、缓冲区存满,或者程序结束时,才会把缓冲区里的内容真正输出到终端。
第一次循环时,程序刚启动,缓冲区为空,内容可能暂时能显示,但后续循环时,缓冲区没有被触发刷新,输出内容一直滞留在缓冲区里,看起来就像没打印。
2. scanf的类型不匹配与输入缓冲区残留问题
playgame是bool类型,你用%d格式符读取输入,虽然多数编译器会把bool当作int的别名处理,但这属于不规范用法,可能引发未定义行为。- 更严重的是:输入数字后按下的回车符(
\n)会留在输入缓冲区。如果后续输入非数字内容,scanf会读取失败,此时playgame的值不会被修改,循环持续执行,但输入缓冲区里的无效字符会一直存在,导致后续scanf持续失败,同时前面的printf输出因为缓冲区没刷新,始终无法显示。
修复方案
针对上述问题,修改后的代码如下:
#include <stdio.h> #include <stdbool.h> void printboard(char *boardp) { // 添加换行符,触发缓冲区刷新 printf(" %c | %c | %c \n", *(boardp), *(boardp + 1), *(boardp + 2)); } int main() { char board[3]; board[0] = 'a'; board[1] = 'b'; board[2] = 'c'; bool playgame = true; int input; // 用int变量接收输入,避免类型不匹配 while (playgame == true) { printboard(board); board[0] = 'a'; board[1] = 'b'; board[2] = 'c'; // 处理scanf读取失败的情况,同时清空输入缓冲区 if (scanf("%d", &input) != 1) { // 清空缓冲区里的无效字符 while (getchar() != '\n'); } playgame = (input != 0); // 输入0退出循环,非0继续 } return 0; }
额外说明
- 如果不想添加换行符,也可以在
printf后手动调用fflush(stdout)强制刷新输出缓冲区。 - 必须处理
scanf读取失败的情况,否则输入错误后程序会陷入死循环。
内容的提问来源于stack exchange,提问作者Filip Dvorak
相关产品推荐
相关产品推荐

