Melhor resposta
Esta é uma das minhas perguntas favoritas para desqualificar C ++ experts .
Claro, sistema (“PAUSAR”) significa criar um shell do sistema operacional e deixá-lo executar um comando “PAUSAR”.
Na verdade, que funciona apenas no Windows, onde NÃO é um problema de segurança , uma vez que“ PAUSE ”é um comando interno do shell que não invoca nenhum programa externo (a menos que o próprio shell do sistema seja hackeado … mas então você tem outro problema)
No Windows nem mesmo é um grande “problema de desempenho”: a imagem do CMD.EXE quase certamente já está na RAM, o segmento de dados do CMD é bem pequeno e … bem … Você está pedindo para PAUSAR (não para executar o mais rápido possível!)
Em sistemas outros que o Windows , isso não funcionará (pode não haver comando PAUSE) e é um vazamento de segurança (alguém ca (n criar um programa PAUSE para fazer a tarefa dele em vez da sua).
Portanto, a menos que você tenha como alvo sua única máquina e seu único sistema operacional, isso não será portátil e pode até ser perigoso.
Mas o problema agora se torna “ o que fazer em vez disso?”
É fantástico ver como a maioria dos as respostas são… ERRADO , porque… eles não podem funcionar!
Vamos ver por que:
Seu programa cin
-s dois inteiros, mostra alguns resultados e … deve esperar ou sair?
Vamos supor você quer esperar: como você responde a cin >> a
e cin >> b
?
Sua entrada será semelhante a
12\n
34\n
você DEVE digitar esses f. .ing retorna, porque você precisa sair do modo de entrada do console.
Agora, cin >> a
consumirá “12”. O retorno permanecerá no buffer.
cin >> b
consumirá todos os espaços (inclui retornos) até o primeiro não espaço, do que todos os dígitos. Ele consumirá “\ n34” (e definirá b = 34).
Há até um maldito retorno no buffer de entrada. Então, agora vamos ver como todos os especialistas FALHAM!
- usam
cin.get()
: ERRADO : Será lido um caractere e continuará. E há um caractere no buffer de entrada, então ele não pausará ! - use
cin.ignore()
: ERRADO: Ainda há aquele retorno f… ing no buffer. Você o ignora … e vai mais longe. Sem pausa .
Então, como você deve fazer isso?
Neste exemplo específico, você tem que ignorar tudo o que está no buffer até e incluindo o retorno, então peça algo para ignorar:
cin.clear(); // clear an eventual "bad read" flag
cin.ignore(BIG\_NUMBER,’\n’); // ignore all remaining pending input
cin.get(); //just read one more!
BIG\_NUMBER, é … qualquer coisa maior do que os caracteres que você pode digitar o console antes de pressionar Enter.
A maneira padrão de obter esse número é
numeric\_limits
(don não se esqueça de #include
)
Então, no final…
void pause()
{
cin.clear();
cin.ignore(numeric\_limits
cin.get();
}
irá seja uma função pausa adequada.
Mas agora me diga:
E se alguém digitar
12abcd\n
??
A primeira leitura verá“ 12 ”e a segunda“ a… ”e falhará (não é um dígito!). B não é lido.
Em seguida, pause()
limpará a “parte ruim” e descartará abcd\n
, então leia “1” e saia felizmente.
Moral : ao ler números, sempre verifique se a leitura não falhou e descarte qualquer entrada incorreta:
while(!(cin >> b))
{ cin.clear(); cin.ignore(numeric\_limits
Mas isso também requer gerenciamento de prompts e assim por diante … e leva muito longe do propósito real.
Resposta
Não é uma solução limpa. Algumas pessoas podem chamá-lo de “hack”, outras podem chamá-lo de “solução alternativa”.
Veja, uma das boas propriedades da linguagem C é sua portabilidade . E com a sintaxe do sistema (“PAUSE”), você está perdendo essa portabilidade, porque depende do console que você está usando para executar seu programa.
Agora, quais são as alternativas? Infelizmente, não existe uma solução perfeitamente limpa. Já vi pessoas usando essa sintaxe
std::cout << “Press any key to continue…”;
std::cin >> Some\_variable\_you\_declared\_in\_advance;
Basicamente, este é apenas mais um hack, usando stream para pausar seu programa. Mas você não está perdendo sua portabilidade dessa forma.
Uma das soluções mais limpas que conheço é esta (mas depende muito do gosto):
void pause () {
std::cin.ignore();
}
Dessa forma, você pode usar sua própria função de pausa . Basicamente, ele lê um caractere e o ignora, que é exatamente o que você deseja alcançar. Mas, como eu disse, certamente não é a melhor solução, apenas minha favorita.