You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传入数组指针的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:34:59