如何在覆盖之前打印的内容时将多行打印到标准输出?

问题描述 投票:0回答:1

我是一名正在为大学项目开发​​奥赛罗版本的学生。

它大部分已经完成,所以我正在寻找可以改进的东西。其中之一是制作电路板(打印到标准输出)只需用每次播放替换前一个电路板,确保终端不移动。

以下是最近这样做的尝试:

char c = ' ';
fflush(stdout);
contaPecas(e, pecas);
printf("\n\r* X-%d |SCORE| O-%d *   \n\r\n\r  1 2 3 4 5 6 7 8  "" | N <peça>para novo jogo "
       "em que o primeiro a jogar é o jogador com peça.\n\r", pecas->x, pecas->y);

for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
        if (j == 0)
            printf("%d ", i+1);

        if (opcao == 1 && verificaValida(i,j,turno) == 1)
            c = '.';
        else if (opcao == 2 && (*turno)->N != 0 && i == sugestao->y && j == sugestao->x)
            c = '?';
        else
            switch (e.grelha[i][j]) {
                case VALOR_O:
                    c = 'O';
                    break;
                case VALOR_X:
                    c = 'X';
                    break;
                case VAZIA:
                    c = '-';
                    break;
            }
        printf("%c ", c);
    }

    switch (i) {
            case 0:
                printf("  | A para novo jogo contra bot. O jogador comeca com peça X.\n\r");
                break;
            case 1:
                printf("  | L<ficheiro>para ler um jogo de ficheiro.\n\r");
                break;
            case 2:
                printf("  | E <ficheiro> escrever em ficheiro estado do jogo.\n\r");
                break;
            case 3:
                printf("  | J<L,C>jogar peça atual na posição (l,c).\n\r");
                break;
            case 4:
                printf("  | S para imprimir um ponto ‘.’nas posições com jogada válida.\n\r");
                break;
            case 5:
                printf("  | H para sugestão de jogada. Deve ser colocado um ‘?’no sitio sugerido.\n\r");
                break;
            case 6:
                printf("  | U para desfazer a última jogada(Undo).\n\r");
                break;
            case 7:
                printf("  | Q para sair do jogo.\n\r");
                break;
        }
    }
if (e.peca == 0) printf("\n\r");
else if (e.peca == VALOR_X) printf("Turn: X\n\r\n\r");
else printf("Turn: O\n\r\n\r");

if (opcao == 2 && (*turno)->N != 0)
    printf("A melhor jogada é %d %d.\n\r", sugestao->y+1, sugestao->x+1);

}

我期望用fflush(stdout)它会擦除之前的打印件,并且用'\ r'表示它会像以前一样在同一个地方写入,但它会继续写入已经写好的内容并使终端移动。关于我能做些什么来解决这个问题的任何想法?

c printf carriage-return
1个回答
2
投票

即使使用\r,标准函数(scanffgets ......)从stdin读取,直到按下Return,在这些情况下,光标总是向下(消耗\n)到控制台的下一行。

您需要使用一些专用库,您可以在unix上检查ncurses或在Windows中检查控制台API。

另一个选项(如果您在vt100兼容终端下)使用控制台代码:

#define gotoxy(x,y) printf("\033[%d;%dH", (x), (y))

man console_codes获取更多信息)

© www.soinside.com 2019 - 2024. All rights reserved.