Pergunta

Uma das primeiras coisas que aprendi em C ++ foi que

#include <iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    return 0;
}

simplesmente aparecem e desaparecem muito rapidamente sem pausa. Para evitar isso, eu tinha que ir para o bloco de notas, e salvar

helloworld.exe
pause

ase

helloworld.bat

Este tem tedioso quando eu precisava para criar um monte de pequenos programas de testes, e, eventualmente, eu simplesmente colocar while(true); no final na maioria dos meus programas de teste, apenas para que eu pudesse ver os resultados. Existe uma melhor função de espera que eu posso usar?

Foi útil?

Solução

Você pode exigir que o usuário pressione Enter antes de fechar o programa ... algo como isso funciona.

#include <iostream>
int main()
{
  std::cout << "Hello, World\n";
  std::cin.ignore();
  return 0;
}

O cin lê na entrada do usuário, e a função .ignore () de cin diz ao programa para simplesmente ignorar a entrada. O programa continuará uma vez os hits do usuário digite.

Fazer a ligação

Outras dicas

Muitas pessoas têm sugerido sleep POSIX, o Windows Sleep, o Windows system("pause"), cin.get() C ++ ... não há sequer um getch() DOS lá, desde 1920 mais ou menos o final.

Por favor, não fazem qualquer um destes.

Nenhuma destas soluções passaria revisão de código na minha equipe. Isso significa que, se você enviou este código para inclusão em nossos produtos, o seu commit seria bloqueado e você seria dito para ir e encontrar outra solução. (Pode-se argumentar que as coisas não são tão graves quando você é apenas um hobby brincar, mas proponho que o desenvolvimento de bons hábitos em seus projetos de estimação é o que vai fazer de você um valor profissional em uma organização empresarial, e mantê-lo contratado. )

Manter a janela aberta console para que você pode ler a saída do seu programa é não a responsabilidade de seu programa! Quando você adiciona uma espera / sleep / bloco para o final do seu programa, você está violando o princípio da responsabilidade individual, criando um vazamento abstração enorme, e obliterando a reutilização / chainability do seu programa. Já não preciso de entrada e dá saída - ele bloqueia por razões de uso transitórios. Isto é muito não é bom.

Em vez disso, você deve configurar seu ambiente para manter o prompt aberto após o programa terminou o seu trabalho. Seu script Batch invólucro é uma abordagem bom! Posso ver como seria chato ter que manter manualmente a atualização, e você não pode chamar-lo de seu IDE. Você poderia fazer o script tomar o caminho para o programa a ser executado como um parâmetro, e configurar o IDE para invocá-lo em vez de seu programa diretamente.

Uma abordagem interina, quick-start seria alterar comando de execução do seu IDE a partir cmd.exe <myprogram> ou <myprogram>, para cmd.exe /K <myprogram>. O interruptor /K para cmd.exe faz com que o prompt de permanecer aberto após o programa no caminho dado tenha terminado . Este vai ser um pouco mais irritante do que a sua solução de script em lotes, porque agora você tem que digitar exit ou clique no 'X' vermelho quando você terminar de ler a saída do seu programa, ao invés de apenas bater a barra de espaço.


Eu assumo o uso de um IDE, porque senão você já está invocando a partir de um prompt de comando, e isso não seria um problema em primeiro lugar. Além disso, eu assumo o uso do Windows (com base em detalhe dado na questão), mas esta resposta se aplica a qualquer plataforma ... que é, aliás, a metade do ponto.

Por favor, note que o código acima foi testado em Code :: Blocks 12.11 e Visual Studio 2012 | no Windows 7.

Para forçar a sua paragem programa ou espera, você tem várias opções:


  • sleep (int não assinado)

O valor tem de ser um número inteiro positivo em milissegundos. Isso significa que se você quiser a sua espera programa por 2 segundos, entram 2000.

Aqui está um exemplo:

#include <iostream>     //for using cout
#include <stdlib.h>     //for using the function sleep

using namespace std;    //for using cout

int main(void)         
{
   cout << "test" << endl;
   sleep(5000);         //make the programme waiting for 5 seconds
   cout << "test" << endl;
   sleep(2000);         // wait for 2 seconds before closing

   return 0;
}

Se você esperar muito tempo, que provavelmente significa que o parâmetro é em segundos. Então alterá-lo para isto:

sleep(5);

Para aqueles que recebem mensagem de erro ou problema usando tentativa sono para substituí-lo por _sleep ou sono especialmente no Código :: Bloks.
E se você ainda está recebendo problemas, tente adicionar de um este biblioteca no início do código.

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <dos.h>
#include <windows.h>

  • system ( "PAUSE")

Um simples "Olá, mundo" programa no aplicativo de console janelas provavelmente perto antes que você pode ver nada. Que o caso em que você pode usar o sistema ( "Pausa").

#include <iostream>    

using namespace std;   

int main(void)         
{
    cout << "Hello world!" << endl;

    system("PAUSE");

    return 0;
}

Se você receber a mensagem "Erro: 'sistema' não foi declarada neste âmbito" basta adicionar a seguinte linha na biggining do código:

#include <cstdlib>

  • cin.ignore ()

O mesmo resultado pode ser alcançado através da utilização cin.ignore ():

#include <iostream>     

using namespace std;    

int main(void)         
{
    cout << "Hello world!" << endl;

    cin.ignore();

    return 0;
}

  • cin.get ()

exemplo:

#include <iostream>     

using namespace std;    

int main(void)         
{
    cout << "Hello world!" << endl;

    cin.get();

    return 0;
}

  • getch ()

Apenas não se esqueça de adicionar o conio.h biblioteca:

#include <iostream>     
#include <conio.h>    //for using the function getch()

using namespace std;    

int main(void)
{

    cout << "Hello world!" << endl;

    getch();

    return 0;
}

Você pode ter mensagem dizendo para você usar _getch () insted de getch

O aparecimento e desaparecimento de uma janela para exibir texto é uma característica de como você está executando o programa, não da C ++.

Executar em um ambiente de linha de comando persistente, ou incluem de janelas suporte em seu programa, ou o uso sleep ou espera na entrada, como mostrado em outras respostas.

o equivalente ao programa de lote seria

#include<iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    std::cin.get();
    return 0;
}

A linha adicional faz exatamente o PAUSE faz, aguarda uma entrada de caracteres única

Na verdade, ao contrário das outras respostas, acredito solução que do OP é a que é mais elegante.

Aqui está o que você ganha usando um invólucro .bat externo:

  1. A aplicação obviamente aguarda a entrada do usuário, por isso já faz o que quiser.
  2. Você não atravancar o código com chamadas difíceis. Quem deve esperar? main()?
  3. Você não precisa lidar com questões de plataforma cruzada - ver quantas pessoas system("pause") sugerida aqui
  4. .
  5. Sem isso, para testar seu executável de forma automática no modelo de teste de caixa preta, você precisa para simular o pressionamento enter (a menos que você fazer as coisas mencionadas na nota de rodapé).
  6. Talvez o mais importante - deve qualquer usuário deseja executar o seu aplicativo através de terminal (cmd.exe na plataforma Windows), eles não quiser esperar, uma vez que vai ver a saída de qualquer maneira. Com a técnica .bat invólucro, que pode decidir se deseja executar o .bat (ou .sh) invólucro, ou executar o arquivo executável diretamente.

Focalizando os dois últimos pontos - com qualquer outra técnica, eu esperaria o programa para oferta no interruptor --no-wait menos para que eu, como usuário, pode usar o aplicativo com todo o tipo de operações como canalizando a saída, encadeamento com outros programas, etc. Estes são parte do fluxo de trabalho CLI normal, e adicionando à espera no final, quando você já está dentro de um terminal só fica no caminho e destrói a experiência do usuário.

Por estas razões, a solução IMO .bat é o melhor aqui.

Há um C ++ 11 maneira de fazê-lo. É muito simples, e eu acredito que ele é portátil. Claro que, como Luminosidade raças em órbita apontou, você não deve fazer isso, a fim de ser capaz de ver um Olá mundo em seu terminal, mas existem alguns bons motivos para usar uma função de espera. Sem mais delongas,

#include <chrono> // std::chrono::microseconds
#include <thread> // std::this_thread::sleep_for
std::this_thread::sleep_for(std::chrono::microseconds{});

Mais detalhes estão disponíveis aqui . Veja também sleep_until .

O que você pode ser escrita mais fácil. Em vez de:

#include<iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    return 0;
}

write

#include<iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    system("PAUSE");
    return 0;
}

A Executa a função sistema de qualquer coisa que você dá-lo como se fosse escrito no prompt de comando. Ele suspende a execução do seu programa enquanto o comando está em execução para que você possa fazer qualquer coisa com ele, você pode até mesmo programas de compilação do seu programa PPC.

Sintaxe:

sono void (não assinados segundos);

sleep () suspende a execução de um intervalo (segundos). Com uma chamada para o sono, o programa atual está suspensa a partir de execução para o número de segundos especificados pelos segundos argumento. O intervalo é preciso apenas para o centésimo de segundo mais próximo ou para a precisão do relógio do sistema operacional, o que é menos preciso.

Este exemplo deve deixar claro:

#include <dos.h>
#include <stdio.h>
#include <conio.h>

int main()
{
   printf("Message 1\n");
   sleep(2); //Parameter in sleep is in seconds
   printf("Message 2 a two seconds after Message 1");
   return 0;
}

Lembre-se que você tem a #include dos.h

EDIT:

Você também pode usar WinAPI.

VOID WINAPI Sleep(
DWORD dwMilliseconds
);

Função Sleep (Windows)

Apenas uma nota, o parâmetro na função fornecida pelo winapi é em milissegundos, para que a linha de sono no trecho de código acima ficaria assim "Sleep (2000);"

getchar () fornece uma resposta simplista (aguarda a entrada do teclado). Chamar Sleep (milissegundos) para dormir antes de sair. função Sleep (MSDN)

Você pode usar sleep () ou usleep ().

// Wait 5 seconds
sleep( 5 );

Bem, este é um post antigo, mas eu só contribuirá para a pergunta - alguém pode achar que é útil mais tarde:

adicionando 'cin.get ();' função pouco antes do retorno do main () parece parar sempre o programa de sair antes de imprimir os resultados: ver código de exemplo abaixo:

int main () { fname corda, lname;

  //ask user to enter name first and last name
  cout << "Please enter your first name: ";
  cin >> fname;

  cout << "Please enter your last name: ";
  cin >> lname;     
  cout << "\n\n\n\nyour first name is: " << fname << "\nyour last name is: " 
  << lname <<endl;

  //stop program from exiting before printing results on the screen
  cin.get();
  return 0;

}

Antes da instrução de retorno em você principal, inserir este código:

sistema ( "pause");

Isto irá manter o console até que você pressionar uma tecla.

#include<iostream>
#include<string>

using namespace std;

int main()
{
    string s;
    cout << "Please enter your first name followed by a newline\n";
    cin >> s;
    cout << "Hello, " << s << '\n';
    system("pause");
    return 0; // this return statement isn't necessary
}

A segunda coisa a aprender (um diria que este deve ser o primeiro) é a interface de linha de comando do seu sistema operacional e compilador / bandeiras vinculador e switches.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top