Como parar o aplicativo de console C ++ de sair imediatamente?

193

Ultimamente, tenho tentado aprender C ++ neste site . Infelizmente, sempre que tento executar um dos exemplos de código, vejo esse programa aberto por cerca de meio segundo e depois imediatamente fechado. Existe uma maneira de interromper o programa imediatamente para que eu possa ver os frutos do meu esforço?

Adam P
fonte
5
Você está clicando duas vezes no executável? Você está trabalhando no Windows? Por que você não está trabalhando no shell de comando e digitando os comandos como deseja que sejam executados?
31510 S.Lott
8
@ Lott: Porque se você apertar o botão "Ir" no seu IDE, não precisará se preocupar com um console.
Billy ONeal
4
Você deve adquirir um bom livro para aprender C ++. Sites são bons recursos, mas não são páreo para um bom texto introdutório. Há uma lista definitiva de livros em C ++ aqui: stackoverflow.com/questions/388242/…
James McNellis
6
@ Billy Se pressionar o botão Ir para fechar o aplicativo quando ele terminar, você estará usando o IDE errado.
2
Perguntado e respondido anteriormente aqui: stackoverflow.com/questions/902261/… , embora este tenha um título melhor.
dmckee --- ex-moderador gatinho

Respostas:

121

Edit: Como Charles Bailey aponta corretamente em um comentário abaixo, isso não funcionará se houver caracteres armazenados em buffer stdin, e não há realmente nenhuma boa maneira de contornar isso. Se você estiver executando com um depurador conectado, a solução sugerida por John Dibling é provavelmente a solução mais limpa para o seu problema.

Dito isto, vou deixar isso aqui e talvez alguém ache útil. Eu o usei bastante como uma espécie de hack rápido ao escrever testes durante o desenvolvimento.


No final de sua mainfunção, você pode chamarstd::getchar();

Isso obterá um caractere único stdin, fornecendo a você o tipo de comportamento "pressione qualquer tecla para continuar" (se você realmente quiser uma mensagem "pressione qualquer tecla", precisará imprimir um).

Você precisa #include <cstdio>para getchar.

James McNellis
fonte
15
getcharnão resolve o problema - ou apenas em circunstâncias limitadas, pelo menos. Ele lê um caractere de stdin, mas se já houver caracteres armazenados em buffer no stdin, o programa continuará sem esperar, independentemente de você imprimir ou não um prompt.
CB Bailey
1
@ Charles: Um bom ponto. Ignorar até \né uma solução parcial, mas não ajudará se mais de uma linha de entrada for armazenada em buffer. Eu não sei de uma maneira C ++ padrão para limpar tudo de um fluxo de entrada. : - /
James McNellis 27/03
1
@ James: Velho, mas e quanto std::cin.ignore(std::cin.rdbuf()->in_avail());? Entendi daqui .
GManNickG
1
Uma opção que eu uso muito é std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');com #include <limits>.
Xeo 29/01
5
Por favor, não faça isso. :( Não faz parte da função do seu programa fazer isso.
Lightness Races in Orbit
138

Se você estiver usando o Visual Studio e iniciando o aplicativo de console pelo IDE:

pressionar CTRL-F5 (iniciar sem depuração) iniciará o aplicativo e manterá a janela do console aberta até você pressionar qualquer tecla.

nabulke
fonte
1
Iniciando o console a partir do IDE? Como e por que você faria isso?
CodyBugstein
1
Excelente, funcionou. Por que esse não é o comportamento padrão do Visual Studio?
Luminaire
Eu também pensei que era a maneira de fazê-lo, até hoje, quando eu construir um simples programa de console e o método acima não funcionou :(
KansaiRobot
1
Existe uma versão disso com depuração?
luckyging3r 17/03
109

A solução de James funciona para todas as plataformas.

Como alternativa, Windowsvocê também pode adicionar o seguinte antes de retornar da mainfunção:

  system("pause");

Isso executará o pausecomando que espera até você pressionar uma tecla e também exibe uma boa mensagemPress any key to continue . . .

codaddict
fonte
2
Isso soa como uma variação de uma solução para Rube Goldberg.
Dave Van den Eynde 27/03
4
@Dave Van den Eynde: Também é bastante comum e é padrão no código padrão no DevCPP. +1
Billy ONeal
4
@ Dave, por outro lado, deixa claro que este é apenas um exemplo, enquanto std: getch poderia ser acidentalmente deixado em código real.
Martin Beckett
2
Esta é uma solução perfeitamente válida para aqueles no Windows. Embora não seja ideal, ela não funciona
thecoshman
Solução mais fácil e rápida. Apenas o que eu precisava
CodyBugstein
83

Se você estiver usando o Visual C ++ 2010 Express da Microsoft e se deparar com um problema com CTRL + F5 que não está funcionando para manter o console aberto após a conclusão do programa, consulte este thread do MSDN .

Provavelmente, o seu IDE está definido para fechar o console após uma execução CTRL + F5; de fato, um "Projeto Vazio" no Visual C ++ 2010 fecha o console por padrão. Para mudar isso, faça o que o Microsoft Moderator sugeriu:

Clique com o botão direito do mouse no nome do seu projeto e vá para a página Propriedades, expanda Propriedades de configuração -> Linker -> Sistema, selecione Console (/ SUBSYSTEM: CONSOLE) no menu suspenso Subsistema. Porque, por padrão, o projeto Vazio não o especifica.

Mr. Underhill
fonte
1
E se não for um aplicativo de console?
Jesse Pimenta
3
@ Mr.Underhill Isso funcionará apenas se você iniciar sem o depurador (Ctrl + F5).
Jonathan Mee
Além de ser a única solução sem hack, também é a única maneira de ver impressões dos principais destruidores de objetos da pilha.
Poniros #
20

Eu geralmente coloco um ponto de interrupção na main()cinta encaracolada de fechamento. Quando o final do programa for alcançado por qualquer meio, o ponto de interrupção será atingido e você poderá pressionar a tecla ALT-Tab na janela do console para visualizar a saída.

John Dibling
fonte
14

Por que não apenas executar o programa em um console, ou seja, execute o programa no cmd.exe se você estiver usando o Windows. Dessa forma, a janela permanece aberta após o término do programa.

[EDIT]: Quando eu uso o KDevelop4, há uma instância completa do Bash (uma CLI do Linux) em execução em uma guia na parte inferior do IDE. Qual é o que eu uso nesse tipo de circunstância.

Amos
fonte
3
Porque se você estiver usando um IDE, geralmente não usa um console. Você pressiona, o programa é executado, e é isso.
Billy ONeal
3
Qualquer IDE competente manterá o console na tela quando o aplicativo terminar - o Code :: Blocks, por exemplo, faz exatamente isso.
3
@nobugz: Eu descobri. Para manter a janela, você deve ter / SUBSYSTEM: CONSOLE na linha de comando do vinculador. A documentação diz que esse é o padrão se maindefinido, mas se eu não o definir explicitamente na linha de comando, o VS mata a janela quando o aplicativo sai. sigh #
1125 James McNellis
2
@ James: isso é necessário para obter uma janela do console em primeiro lugar. Por sua vez, isso requer main () em vez de WinMain (), e não o contrário. Eu estou um pouco perdido ...
Hans Passant
4
@nobugz: Se você iniciar a partir de um "Projeto Vazio" em vez de um "Aplicativo de Console Win32", o subsistema não será definido explicitamente nas propriedades do projeto. Se você definir mainno projeto, o vinculador, por padrão, usará o subsistema CONSOLE. Ao depurar ou executar, você verá uma janela do console. No entanto, a menos que você especifique explicitamente CONSOLE como o subsistema nas propriedades do projeto, o Visual Studio não manterá a janela do console aberta. Sempre começo de um projeto vazio e raramente altero as propriedades individuais do projeto, por isso nunca vi a janela do console permanecer. Desculpe pela confusão
James McNellis
9

Antes do final do seu código, insira esta linha:

system("pause");

Isso manterá o console até 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
}
Robert
fonte
Também foi impresso "Pressione qualquer tecla para continuar..." para mim.
PapaHotelPapa
8

Ligue cin.get();2 vezes:

    //...
    cin.get();
    cin.get();
    return 0
}
tsx
fonte
6
mas por que duas vezes ??
Madhawa Priyashantha
e se precisarmos de outro cin.get () para obter, por exemplo, alguma string dentro da matriz antes disso? Não é um trabalho nesse cenário.
Qmaster
4

Se você executar seu código em um IDE competente, como Code :: Blocks , o IDE gerenciará o console usado para executar o código, mantendo-o aberto quando o aplicativo for fechado. Você não deseja adicionar código especial para manter o console aberto, pois isso impedirá que funcione corretamente quando você o usar de verdade, fora do IDE.


fonte
3

Ok, acho que você está no Windows usando o Visual Studio ... por quê? Bem, porque se você estiver em algum tipo de sistema operacional Linux, provavelmente o executará no console.

De qualquer forma, você pode adicionar porcaria ao final do seu programa, como outros sugerem, ou apenas pressionar CTRL + F5 (iniciar sem depuração) e o Visual Studio deixará o console pronto assim que concluído.

Outra opção, se você deseja executar a versão Debug e não adicionar porcaria ao seu código, é abrir a janela do console (Iniciar -> Executar -> cmd) e navegar para o diretório de saída Debug . Em seguida, basta digitar o nome do seu executável e ele executará seu programa de depuração no console. Você pode usar o anexo do Visual Studio para processar ou algo assim, se realmente quiser.

Polaris878
fonte
3
#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{

    cout << "Press any key to continue...";
    getch();

    return 0;
}

Eu não percebi mais ninguém postar isso, então aqui está.

Ruan
fonte
Eu acrescentaria que conio.hé um cabeçalho específico do Windows e pode não estar disponível em todas as máquinas (ou talvez você precise vinculá-lo separadamente, o que é um exagero).
Yksisarvinen
Trabalhando. só precisava mudar getch (); para _getch (); desde que se tornou depreceated
ncesar
2

Se você estiver realmente depurando seu aplicativo no Visual C ++, pressione F5 ou o triângulo verde na barra de ferramentas. Se você não está realmente depurando (você não tem pontos de interrupção definidos), pressione Ctrl + F5 ou escolha Iniciar sem depuração nos menus (geralmente é no menu Debug, o que eu concordo é confuso.) Será um pouco mais rápido, e mais importante para você, fará uma pausa no final sem que você precise alterar seu código.

Como alternativa, abra um prompt de comando, navegue até a pasta onde está o seu exe e execute-o digitando seu nome. Dessa forma, quando terminar de executar, o prompt de comando não fechará e você poderá ver a saída. Eu prefiro os dois métodos ao adicionar código que interrompe o aplicativo assim que terminar.

Kate Gregory
fonte
2

Basta adicionar o seguinte no final do seu programa. Ele tentará capturar alguma forma de entrada do usuário, impedindo o fechamento automático do console.

cin.get();
Bat_Programmer
fonte
2

Adicione as seguintes linhas antes de qualquer exit()função ou antes de qualquer returns em main():

std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");
Thomas Matthews
fonte
Isso não funciona para mim, as primeiras obras de linha, mas pressionar enter não faz nada
Qwertie
2

Para o Visual Studio (e apenas o Visual Studio), o seguinte trecho de código fornece um prompt 'aguarde a continuação do pressionamento de tecla' que realmente espera que o usuário pressione uma nova tecla explicitamente, liberando primeiro o buffer de entrada:

#include <cstdio>
#include <tchar.h>
#include <conio.h>

_tprintf(_T("Press a key to continue "));
while( _kbhit() /* defined in conio.h */ ) _gettch();
_gettch();

Observe que isso usa as tchar.hmacro para ser compatível com vários 'conjuntos de caracteres' (como o VC ++ os chama).

MicroVirus
fonte
2

Eu apenas faço isso:

//clear buffer, wait for input to close program
std::cin.clear(); std::cin.ignore(INT_MAX, '\n');
std::cin.get();
return 0;

Nota: limpar o buffer cin e isso só é necessário se você tiver usado o cin em algum momento no início do seu programa. Também usar std :: numeric_limits :: max () provavelmente é melhor que INT_MAX, mas é um pouco prolixo e geralmente desnecessário.

GuestPerson00001
fonte
Funciona, mas o retorno 0; não será executado se eu usar esse código.
Wernersbacher
2

Use #include "stdafx.h"& system("pause");como no código abaixo.

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
    std::cout << "hello programmer!\n\nEnter 2 numbers: ";
    int x, y;
    std::cin >> x >> y;
    int w = x*y;
    std::cout <<"\nyour answer is: "<< w << endl;
    system("pause");
}
Mohammed Nouh
fonte
systemé declarado em <cstdlib>, não stdafx.h.
Melpomene
1

Idéia semelhante a yeh resposta, apenas alternativa minimalista.

Crie um arquivo em lotes com o seguinte conteúdo:

helloworld.exe
pause

Em seguida, use o arquivo em lotes.

Cœur
fonte
1

simplesmente

#include <cstdio>

    int main(){
        // code...
        std::getchar();
        std::getchar();
        return 0;
    }

por alguma razão, geralmente há 1 caractere possível de ler com o getchar já no stdin, quando você executa um programa. portanto, o primeiro getchar lê esse caractere e o segundo getchar aguarda a entrada do usuário (sua) antes de sair do programa. E depois que um programa sai da maioria dos terminais, especialmente no Windows, feche o terminal imediatamente. portanto, o que pretendemos é uma maneira simples de impedir que um programa seja concluído depois que ele gera tudo. É claro que existem maneiras mais complexas e limpas de resolver isso, mas essa é a mais simples.

Dmitriy Suserov
fonte
2
Adicione pelo menos uma breve explicação de por que isso resolve o problema.
kaya3
0

Veja se o seu IDE possui uma caixa de seleção na configuração do projeto para manter a janela aberta após o término do programa. Caso contrário, use std::cin.get();para ler um caractere no final da função principal. No entanto, certifique-se de usar apenas a entrada baseada em linha (std :: getline) ou de lidar com os caracteres não lidos restantes (std :: ignore até newline) porque, caso contrário, o .get () no final lerá apenas o lixo que você deixou não lidas anteriormente.

Tronic
fonte
0

Isso parece funcionar bem:

cin.clear();
cin.ignore(2);

Se você limpar o buffer primeiro, não será um problema quando você ler o próximo. Por alguma razão cin.ignore(1)não funciona, tem que ser 2.

Northcode
fonte
1
2 às vezes também não é suficiente (quando há mais pressionamentos de tecla na fila). A maneira correta é ignorar o número de caracteres na fila. Para com cin.rdbuf()->in_avail,. Não algum número mágico como 1 ou 2.
Konrad Rudolph
0

Você sempre pode apenas criar um arquivo em lotes. Por exemplo, se seu programa for chamado helloworld.exe, algum código seria:

@echo off
:1
cls
call helloworld.exe
pause >nul
goto :1
yeh
fonte
0

Se você estiver executando o Windows, poderá fazer system("pause >nul");ou system("pause");. Ele executa um comando do console para pausar o programa até você pressionar uma tecla. >nulimpede de dizer Press any key to continue....

PatThaCoder
fonte
0

Estou colocando um ponto de interrupção no último retorno 0 do programa. Funciona bem.

Lierosk
fonte
1
Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem - você sempre pode comentar em suas próprias postagens e, quando tiver reputação suficiente , poderá comentar em qualquer post .
Ravi Dhoriyaツ
1
Como isso não fornece resposta? Estou exatamente na mesma situação como autor de uma pergunta e isso ajuda.
Lierosk
0

Eu usei cin.get()e isso funcionou, mas um dia eu precisava usar outro cin.get([Array Variable])antes disso para pegar uma corda de ling com caracteres em branco no meio de. portanto cin.get(), não evitou o fechamento da janela do prompt de comando. Finalmente, encontrei Outra maneira: Pressione CTRL + F5 para abrir em uma janela externa e o Visual Studio não tem mais controle sobre ela. Apenas perguntará sobre o fechamento após a execução dos comandos finais.

QMaster
fonte
0

Eu tentei colocar uma getchar()função no final. Mas não deu certo. Então, o que eu fiz foi adicionar duas getchar()funções uma após a outra. Eu acho que o primeiro getchar()absorve a Entertecla que você pressiona após a última entrada de dados. Portanto, tente adicionar duas getchar()funções em vez de uma

Nathan Tuggy
fonte
0

Em vez de pressionar o botão de execução, pressione CTRL e F5 ao mesmo tempo, pressionando qualquer tecla para continuar a mensagem. Ou digite "(aviso, use isso apenas para testar programas não reais, pois os antivírus não gostam disso !!!!)" no final da sua função principal, mas: (aviso, use isso apenas para testar programas não reais, pois os antivírus não não gosto !!!!)

anonia
fonte
0

basta usar cin.ignore () logo antes do retorno 0; duas vezes

main()
  {
  //your codes 

  cin.ignore();
  cin.ignore();

  return 0;
  }

Isso é tudo

Kursat Turkay
fonte
Eu normalmente faço isso algo assim. cin.ignore (); cin.get ();
precisa saber é
-1

Tudo o que você precisa fazer é definir uma variável para x, basta digitar isso antes do retorno 0;

cout<<"\nPress any key and hit enter to end...";
cin>>x;
Conselho amigável
fonte
-1

Você pode até declarar um número inteiro no início de sua main()função (digamos int a;) e colocar um std::cin >> a;pouco antes do valor de retorno. Portanto, o programa continuará em execução até você pressionar uma tecla e entrar.

Izza
fonte