Dúvida sobre printf("\e[H\e[2J"); [RESOLVIDO]

1. Dúvida sobre printf("\e[H\e[2J"); [RESOLVIDO]

Steve
Steve

(usa Slackware)

Enviado em 12/05/2018 - 23:52h

Estudando por ai, vi exemplos de limpar a tela usando o printf porém não compreendi o comando!

Todos os 2 comandos abaixo limpam a tela do terminal do Linux, igual como usar system("clear");
printf("\e[H\e[2J");
printf("\33[H\33[2J");

Porém eu não entendi como e porque essas Strings no printf conseguem LIMPAR o terminal.
NOTEI que na prática nada LIMPA de verdade o terminal, ele apenas é preenchido com linhas em branco, até mesmo o CLEAR faz isso.
FICO na dúvida se esses comandos, estão pulando linhas, tipo 33 linhas? Olhei que o \e seria um double mas continuei sem entender o comando de qualquer forma.

Eu gostaria de entender o que é cada uma dessas Strings usadas para eu entender o que elas estão de verdade fazendo!
Obrigado a quem souber e puder ajudar!


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/05/2018 - 00:23h

A maioria dos terminais e emuladores de terminais usados em computadores com UNIX seguem o padrão ANSI X3.64 (ou alguma variação, que pode ser tanto um subconjunto, como o VT-100, ou incorporar extensões, como o xterm-256color), que usa sequências de especiais de caracteres para fazer com que o terminal execute funções especiais, tais como reposicionar o cursor, mudar atributos de caracteres ou limpar a tela.

A maioria dessas sequências especiais começa com o caráter ASCII chamado "ESC" (abreviação de escape), que tem código 27 (em octal, 033; em hexadecimal, 0x1b), e que pode ser expresso em uma constante de caracteres do C como '\033', '\x1b' ou '\e'. O caracteres que vêm em seguida determinam a função que será executada, de acordo com as definições do padrão.

Contudo, eu considero que colocar essas sequências de escape diretamente no código é uma prática tão ruim quanto chamar system("clear") ou system("cls"). E por quê? Porque, como eu disse no início, embora a maioria dos terminais e emuladores de terminais sejam compatíveis com ANSI X3.64, existem terminais que não o são. Eu mesmo usei, durante muito tempo, terminais que não o eram, e sei como é ruim ter gente supondo coisas erradas sobre o hardware (ou software, no caso de emuladores) que a gente usa. (De certa maneira, uma reedição disso é quando você entre num site que só funciona com tipo ou versão específica de um navegador, ou que requer um plugin obsoleto e que só está genericamente disponível para um certo sistema operacional.)

Uma maneira melhor de fazer é não assumir um terminal específico, e usar diretamente aquilo que o usuário configurar. Para tanto, veja a resposta nº 4 do seguinte tópico desta comunidade: https://www.vivaolinux.com.br/topico/C-C++/Como-limpar-a-tela-do-terminal-em-c.

3. Re: Dúvida sobre printf("\e[H\e[2J"); [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/05/2018 - 03:33h

Quanto ao modo como cada terminal “limpa” a tela, isso pode variar de acordo com o tipo de terminal ou com a implementação. Genericamente falando, “limpar a tela” geralmente consiste em colocar em cada célula do terminal um conteúdo que faça parecer que tal célula está vazia. Como o espaço em branco não produz nenhuma marca visível, ele é um candidato a ser usado para ocupar a célula “limpa”.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts