Как напечатать несколько строк в стандартный вывод при перезаписи того, что было напечатано раньше?

#c #printf #carriage-return

#c #printf #возврат каретки

Вопрос:

Я студент, в настоящее время разрабатываю версию «Отелло» для университетского проекта.

В основном она доработана, поэтому я ищу то, что могу улучшить. Один из них заключается в том, чтобы плата (которая печатается в стандартном режиме) просто заменяла предыдущую при каждом воспроизведении, гарантируя, что терминал не перемещается.

Ниже приведена самая последняя попытка сделать это:

 char c = ' ';
fflush(stdout);
contaPecas(e, pecas);
printf("nr* X-%d |SCORE| O-%d *   nrnr  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.nr", 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 amp;amp; verificaValida(i,j,turno) == 1)
            c = '.';
        else if (opcao == 2 amp;amp; (*turno)->N != 0 amp;amp; i == sugestao->y amp;amp; 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.nr");
                break;
            case 1:
                printf("  | L<ficheiro>para ler um jogo de ficheiro.nr");
                break;
            case 2:
                printf("  | E <ficheiro> escrever em ficheiro estado do jogo.nr");
                break;
            case 3:
                printf("  | J<L,C>jogar peça atual na posição (l,c).nr");
                break;
            case 4:
                printf("  | S para imprimir um ponto ‘.’nas posições com jogada válida.nr");
                break;
            case 5:
                printf("  | H para sugestão de jogada. Deve ser colocado um ‘?’no sitio sugerido.nr");
                break;
            case 6:
                printf("  | U para desfazer a última jogada(Undo).nr");
                break;
            case 7:
                printf("  | Q para sair do jogo.nr");
                break;
        }
    }
if (e.peca == 0) printf("nr");
else if (e.peca == VALOR_X) printf("Turn: Xnrnr");
else printf("Turn: Onrnr");

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

}

Я ожидал, что с помощью fflush (стандартный вывод) он сотрет предыдущие отпечатки, а с помощью ‘ r’ он просто напишет в том же месте, что и раньше, но он продолжает писать под тем, что уже было написано, и заставляет терминал двигаться. Есть какие-нибудь идеи о том, что я мог бы сделать, чтобы исправить это?

Комментарии:

1. Одно из основных улучшений, которое вы можете сделать, это всегда писать код на английском языке с английскими именами переменных и функций.

2. Вам также может быть интересно позвонить system("clear"); , чтобы очистить текущий терминал

3. @Lundin Обычно я бы так и сделал, но было специально предложено, чтобы мы работали с шаблоном на португальском языке, поэтому я решил оставить остальное на португальском. Для меня это тоже выглядит очень неправильно!

Ответ №1:

Даже при использовании r стандартных функций ( scanf , fgets …) считывается до stdin Returnнажатия клавиши a, в этих случаях курсор всегда опускается ( n переходит) на следующую строку консоли.

Вам нужно использовать какую-то специализированную библиотеку, вы можете проверить ncurses на unix или console API в Windows.

Другим вариантом (если вы используете терминал, совместимый с vt100) является использование консольных кодов:

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

( man console_codes для получения дополнительной информации)

Комментарии:

1. Я бы не рекомендовал использовать conio, это устаревшее дерьмо DOS. В Windows используйте консольный API напрямую.

2. @Lundin, ты имеешь в виду, что Turbo C устарел? вы правы, отредактировано 😉

3. Не сбивайте мой Borland Turbo C / C для DOS. Я получил его в 89-м, и тогда он был хорош. Даже пришел с тасмом… Это было всего пару лет назад. Должно быть, все еще хорошо, верно? Он даже использовал математический сопроцессор 8087 на моей плате 386!

4. @DavidC.Rankin да! Правила Turbo C i.ebayimg.com/images/g/Jx8AAOSwgzBcM1cO/s-l500.jpg

5. Да, в моем ящике все еще полно дискет 360k и 1.2m 5.25 (и у меня все еще есть пара дисков, которые их читают…. :)