Pare de usar system() nos seus códigos!!!

Usar system() é algo clássico para o usuário novato. E é algo que mostra, sem sombra de dúvida, o quão inepto é o “programador”. O código abaixo, por exemplo, funcionará somente no MS-DOS e no Prompt DOS do Windows:

#include <stdio.h>
#include <stdlib.h>

void main(void)
{
  system("cls");
  puts("hello");
}

Se você compilar isso para Linux ou OS/X, imagine só o que obterá na chamada a system! Um ERRO! Além da chamada ser extremamente lenta! Eis duas funções que você pode considerar úteis, no que se refere ao console. Funcionam tanto no Linux quanto no OS/X e no Windows:

#if defined(__linux) || defined(__APPLE__)
#include <stdio.h>

/* Usa ANSI */
void clearscreen(void) { fputs("\x1b[2J", stdout); }
void gotoxy(int x, int y) { printf("\x1b[%d;%dH", ++x, ++y); }
#else
#include <windows.h>

/* Usa a API do Windows (ele não suporta ANSI!) */
void clearscreen(void)
{
  HANDLE hConsole;
  COORD coord = {0, 0};
  CONSOLE_SCREEN_BUFFER_INFO csbi;
  DWORD dwConsoleSize, dwWriten;

  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleScreenBufferInfo(hConsole, &csbi);
  dwConsoleSize = csbi.dwSize.X * csbi.dwSize.Y;

  FillConsoleOutputCharacter(hConsole, (TCHAR)' ', 
                             dwConsoleSize, coord, &dwWriten);
  FillConsoleOutputAttribute(hConsole, csbi.wAttributes, 
                             dwConsoleSize, coord, &dwWriten);

  SetConsoleCursorPosition(hConsole, coord);
}

void gotoxy(int x, int y)
{
  HANDLE hConsole;
  COORD coord;

  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  coord.X = x;
  coord.Y = y;
  SetConsoleCursorPosition(hConsole, coord);
}
#endif

Quanto ao “PAUSE”, que muita gente usa no fim dos programas do tipo console, use getc(stdin).

UPDATE: Outro detalhe importante… O header conio.h não existe fora de compiladores como o TURBO C ou o Microsoft C Compiler 6.0, ambos para o antigo MS-DOS. Este não é um header padronizado e não vai funcionar com os compiladores modernos.

Anúncios

2 comentários sobre “Pare de usar system() nos seus códigos!!!

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s