Impedindo o fechamento da janela do console no aplicativo Visual Studio C / C ++ Console


464

Esta é provavelmente uma pergunta embaraçosa, pois a resposta é obviamente óbvia.

Eu uso o Visual Studio há anos, mas é a primeira vez que desenvolvo qualquer desenvolvimento de 'Aplicativo de Console'.

Quando executo meu aplicativo, a janela do console é exibida, a saída do programa é exibida e a janela é fechada quando o aplicativo é encerrado.

Existe uma maneira de mantê-lo aberto até que eu verifique a saída ou exibir os resultados após o fechamento da janela?


O Monodesenvolvimento faz o que você está esperando.
ctrl-alt-delor

3
Há muitas respostas abaixo, então eu copiar uma resposta aqui: se você estiver usando VS2017, em seguida, Ferramentas> Opções> Debugging-> Fechar automaticamente o console
jw_

Acordado. Acho que a melhor resposta para o VS 2017 e mais recente é a da chronoxor.
Toda a raiva

Respostas:


466

Se você executar sem depurar (Ctrl + F5), por padrão, ele solicitará que você pressione Enter para fechar a janela. Se você deseja usar o depurador, coloque um ponto de interrupção na última linha.


268
Se você tiver um aplicativo C ++ e Executar sem depuração e a janela do console ainda fechar, lembre-se de definir explicitamente o subsistema para Console em Propriedades de configuração / Vinculador / Sistema. Isso pode acontecer se você começar com um projeto vazio, que deixa o subsistema desativado.
Trevor Robinson

4
Não funcionou para mim :( A janela do console abre e fecha imediatamente, mas as pausas de registro e aguarda uma pressão adicional da F5
CodyBugstein

40
A resposta correta é a de @TrevorRobinson: Aqui está a versão expandida, se você tiver problemas para descobrir onde estão as propriedades de configuração: Clique com o botão direito do mouse em seu projeto em Visual Studio> Propriedades> Propriedades de Configuração> Linker> Sistema, altere Subsistema para " Console "
PlagueHammer

3
Trevor Robinson está certo. Se você iniciar um projeto em branco e o item C ++. Você precisa ir para Exibir-> Gerenciador de propriedades-> Propriedade (ícone de chave inglesa) -> Config. Propriedades-> Vinculador-> Sistema-> Subsistema-> no menu pop-up, escolha Console.
senhor mais venerável

10
Estou trabalhando na comunidade VS 2017. ctrl+f5não está funcionando, não há Propertiesquando clico com o botão direito do mouse no projeto, também o wrench iconestá acinzentado.
Ketan

232

Clique com o botão direito do mouse no seu projeto

Propriedades> Propriedades de configuração> Vinculador> Sistema

Selecione Console (/ SUBSYSTEM: CONSOLE) na SubSystemopção ou você pode apenas digitar Console no campo de texto!

Agora tente ... deve funcionar


Isso funcionou para o meu VS2013 Express, mas a resposta aceita não. Muito estranho, pois a resposta aceita funcionou para todas as versões do Visual Studio que eu usei no passado.
Michael Calvin

9
@ MichaelCalvin Você precisa rodar com Ctrl + F5 depois de definir isso, esse é o kicker.
Jonathan Mee

como @JonathanMee afirmou que você ainda executou Ctrl + F5. Isso já estava definido no meu estúdio visual de 2015, então a primeira resposta foi a que mais ajudou.

Isso está realmente correto. O familiar CTRL+F5falhará se você, por exemplo, adicionar um novo arquivo C ++ a um projeto vazio.
precisa saber é o seguinte

Trabalhou para mim no Visual Studio Express 2015. Obrigado.
LHC

44

Aqui está uma maneira de C / C ++:

#include <stdlib.h>

#ifdef _WIN32
    #define WINPAUSE system("pause")
#endif

Coloque isso na parte superior do seu programa e, se estiver em um sistema Windows ( #ifdef _WIN32), criará uma macro chamada WINPAUSE. Sempre que você quiser que seu programa seja pausado, chame WINPAUSE;e ele fará uma pausa no programa, usando o comando DOS. Para outros sistemas como Unix / Linux, o console não deve encerrar na saída do programa.


Este método não funciona no Visual C ++ (a menos que você incluir algum cabeçalho?)
WMAC

2
@wmac Você tem que incluir o cabeçalho windows.h
Geowil

1
Não incluí nenhuma biblioteca ou espaço para nome, mas ele foi executado corretamente, muito obrigado.
Halil İbrahim Oymacı

1
Não faça isso, por favor. O pausecomando é específico do Windows.
Firegurafiku # 30/16

Trabalhou para mim no Visual Studio 2013 Express. :)
Anirban

32

Ir para Menu de Depuração-> Pressione Iniciar sem Depuração


Isso nem é uma opção no VS 2008, a menos que o ambiente de desenvolvimento C # tenha sido escolhido. CTRL + F5 funciona embora. Você também pode adicionar isso como um botão à barra de ferramentas em Ferramentas> Personalizar.
perry

Se você tiver vários projetos, defina o relevante como o projeto de inicialização
cara do CAD

27

Se você estiver usando o .NET, coloque Console.ReadLine()antes do final do programa.

Isso vai esperar <ENTER>.


9
+1 - Isso ou Console.ReadKey()apenas esperar por qualquer tecla.
Fredrik Mörk

Estranho, isso não tem efeito no meu aplicativo. Ele ainda fecha sem aguardar a entrada do usuário.
21415 Kokodoko

4
É provável que seu código esteja saindo antes de chegar a esse ponto.
Na verdade

20

A partir do Visual Studio 2017 (15.9.4), existe uma opção:

Tools->Options->Debugging->Automatically close the console

O fragmento correspondente da documentação do Visual Studio :

Feche o console automaticamente quando a depuração parar:

Informa ao Visual Studio para fechar o console no final de uma sessão de depuração.


2
Acabei de testar isso no VS2017 e VS2019. Requer a configuração do subsistema como CONSOLE e a desativação dessa opção. Ter um ou outro ou nenhum dos dois fecha a janela automaticamente.
27419 Casey

Isso ainda fecha a janela para mim se eu lançar vários projetos da mesma solução.
Serge Rogatch 25/08/19

Sinto que esta é a resposta certa para o VS 2017 e para a frente. Pena que não está nas versões mais antigas.
Toda a raiva

13

tente ligar getchar()logo antes do main()retorno.


Não funciona no VS 2008 para um aplicativo simples de console Hello Name. cout, cin, cout, getchar (), o console ainda fecha. Qual é o problema?
perry

1
Tente colocar getchar () duas vezes se você tiver um cout antes de getchar (). getchar () espera um caractere e você já o está dando com cout ... Deixe-me saber se isso ajuda :)
Magarusu

12

(/ SUBSYSTEM: CONSOLE) não funcionou para o meu vs2013 (eu já o tinha).

"executar sem depuração" não é uma opção, pois não quero alternar entre depuração e exibição de saída.

Eu terminei com

int main() {
  ...
#if _DEBUG
  LOG_INFO("end, press key to close");
  getchar();
#endif // _DEBUG
  return 0;
}

Solução usada no qtcreator pré 2.6. Agora, enquanto o qt está crescendo, o vs está indo para o outro lado. Pelo que me lembro, no vs2008 não precisávamos de tais truques.


7

Aqui está uma solução que (1) não requer alterações de código ou pontos de interrupção e (2) pausa após o término do programa para que você possa ver tudo o que foi impresso. Pausará após F5 ou Ctrl + F5. A principal desvantagem é que, no VS2013 Express (como testado), ele não carrega símbolos, portanto, a depuração é muito restrita.

  1. Crie um arquivo em lotes. Liguei para o meu runthenpause.bat, com o seguinte conteúdo:

    %1 %2 %3 %4 %5 %6 %7 %8 %9
    pause

    A primeira linha executará qualquer comando que você fornecer e até oito argumentos. A segunda linha irá ... pausar.

  2. Abra as propriedades do projeto | Propriedades de configuração | Depuração.

  3. Altere "Argumentos de comando" para $(TargetPath)(ou o que estiver em "Comando").
  4. Mude "Comando" para o caminho completo para runthenpause.bat.
  5. Clique em OK.

Agora, quando você corre, runthenpause.bat iniciará seu aplicativo e, após seu término, fará uma pausa para que você veja a saída do console.

Vou postar uma atualização se descobrir como carregar os símbolos. Eu tentei /Z7por isso, mas sem sucesso.


1
Isso ainda não suporta depuração, mas pelo menos trata da questão de não conseguir ver a saída, por exemplo, do VLD, em contraste com todas as outras respostas.
Martin Hennings

6

basta colocar como sua última linha de código:

system("pause");

3

Você pode executar seu executável em um prompt de comando. Dessa forma, você pode ver toda a saída. Ou você pode fazer algo assim:

int a = 0;
scanf("%d",&a);

return YOUR_MAIN_CODE;

e dessa maneira a janela não fecharia até você inserir dados para a avariável.


3

adicione "| pause ”na caixa de argumentos de comando na seção de depuração nas propriedades do projeto.


4
Esta seria uma ótima solução se funcionasse. pauseparece funcionar apenas em arquivos em lotes e, embora receba entrada do seu programa no STDIN, não reimprime esse texto. Tentei substituir |por &&, mas não teve efeito - presumivelmente porque não está sendo executado com um shell de comando (cmd.exe).
Brian Vandenberg

3

Basta pressionar CNTRL + F5 para abri-lo em uma janela de linha de comando externa (o Visual Studio não tem controle sobre ele).

Se isso não funcionar, adicione o seguinte ao final do seu código:

Console.WriteLine("Press any key to exit...");
Console.ReadKey();

Isso espera que você pressione uma tecla para fechar a janela do terminal assim que o código chegar ao fim.

Se você quiser fazer isso em vários lugares, coloque o código acima em um método (por exemplo private void Pause()) e chame Pause()sempre que um programa atingir um fim possível.


quando eu faço o cntrl + f5 ele abre e fecha imediatamente? como você conserta aquilo?
Callat

A segunda solução era o que eu estava procurando!
RoG

Quando clico em Ctrl + F5, nada acontece. Costumava funcionar para mim, mas de repente parou de funcionar.
Natasha

2

Uma solução um pouco melhor:

atexit([] { system("PAUSE"); });

no início do seu programa.

Prós:

  • pode usar std :: exit ()
  • pode ter vários retornos do principal
  • você pode executar seu programa no depurador
  • Independente do IDE (+ independente do SO, se você usar o cin.sync(); cin.ignore();truque em vez de system("pause");)

Contras:

  • tem que modificar o código
  • não fará uma pausa em std :: terminate ()
  • ainda acontecerá no seu programa fora da sessão do IDE / depurador; você pode evitar isso no Windows usando:

extern "C" int __stdcall IsDebuggerPresent(void);
int main(int argc, char** argv) {
    if (IsDebuggerPresent())
        atexit([] {system("PAUSE"); });
    ...
}

Muito mau conselho.
Saúde e hth. - Alf

Você pode elaborar o porquê?
precisa saber é o seguinte

No caso em que não se está depurando, não faz nada útil, pois nesse caso não há problema a ser resolvido. No VS, basta executar o programa com Ctrl + F5 e é isso, então não há problema no VS, e em um interpretador de comando não há problema, enfim, não há problema. E no caso em que alguém está depurando e deseja que um código adicionado de parada seja interrompido, não é uma solução mais conveniente que um ponto de interrupção e interfere nas situações em que não se deseja uma parada.
Saúde e hth. #

2

Ou use:

  1. cin.get();

ou

  1. system("pause");

Certifique-se de fazer um deles no final da main()função e antes da returninstrução.


2

Você também pode usar esta opção

#include <conio.h> 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main() {
   .
   .
   .
   getch(); 

   return 0;
}

2

No meu caso, experimentei isso quando criei um projeto C ++ vazio no VS 2017 community edition. Você precisará definir o subsistema como "Console (/ SUBSYSTEM: CONSOLE)" em Propriedades de configuração.

  1. Vá para "Visualizar" e selecione "Gerenciador de propriedades"
  2. Clique com o botão direito do mouse no projeto / solução e selecione "Propriedade". Isso abre uma página de propriedades de teste
  3. Navegue até o vinculador e selecione "Sistema"
  4. Clique em "Subsistema" e uma lista suspensa aparece
  5. Escolha "Console (/ SUBSYSTEM: CONSOLE)"
  6. Aplicar e salvar
  7. Na próxima vez que você executar seu código com "CTRL + F5", você verá a saída.

0

Visual Studio 2015 , com importações . Porque eu odeio quando exemplos de código não fornecem as importações necessárias.

#include <iostream>;

int main()
{
    getchar();
    return 0;
}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.