Empêcher la fenêtre de la console de se fermer sur l'application Visual Studio C / C ++ Console

464

Il s'agit probablement d'une question embarrassante car la réponse est sans aucun doute évidente.

J'utilise Visual Studio depuis des années, mais c'est la première fois que je fais un développement d '«application console».

Lorsque j'exécute mon application, la fenêtre de la console apparaît, la sortie du programme apparaît, puis la fenêtre se ferme à la fermeture de l'application.

Existe-t-il un moyen de le garder ouvert jusqu'à ce que j'aie vérifié la sortie ou d'afficher les résultats après la fermeture de la fenêtre?

Martin
la source
Monodevelop fait ce que vous attendez.
ctrl-alt-delor
3
Il y a trop de réponses ci-dessous, donc je copie une réponse ici: si vous utilisez VS2017, alors Outils-> Options-> Débogage-> Fermez automatiquement la console
jw_
D'accord. Je pense que la meilleure réponse pour VS 2017 et plus récente est celle de Chronoxor.
All the Rage

Réponses:

466

Si vous exécutez sans débogage (Ctrl + F5), par défaut, il vous invite à appuyer sur Retour pour fermer la fenêtre. Si vous souhaitez utiliser le débogueur, vous devez placer un point d'arrêt sur la dernière ligne.

À M
la source
268
Si vous avez une application C ++ et Exécuter sans débogage et que la fenêtre de la console se ferme toujours, vous devez vous rappeler de définir explicitement le sous-système sur Console sous Configuration Properties / Linker / System. Cela peut se produire si vous commencez avec un projet vide, ce qui laisse le sous-système non défini.
Trevor Robinson
4
Cela n'a pas fonctionné pour moi :( La fenêtre de la console s'ouvre et se ferme immédiatement, mais le journal s'arrête et attend une pression supplémentaire de F5
CodyBugstein
40
La bonne réponse est celle de @TrevorRobinson: voici la version développée si vous ne parvenez pas à trouver où se trouvent les propriétés de configuration: cliquez avec le bouton droit sur votre projet dans Visual Studio> Propriétés> Propriétés de configuration> Éditeur de liens> Système, remplacez le sous-système par " Console "
PlagueHammer
3
Trevor Robinson a raison. Si vous démarrez un projet vide et un élément C ++. Vous devez aller dans Affichage-> Gestionnaire de propriétés-> Propriété (icône de clé) -> Config. Propriétés-> Linker-> System-> Subsystem-> dans le menu déroulant, choisissez Console.
plus vénérable monsieur du
10
Je travaille sur la communauté VS 2017. ctrl+f5ne fonctionne pas, il n'y a pas de projet Propertieslorsque je clique avec le bouton droit, également wrench icongrisé.
Ketan
232

Clic droit sur votre projet

Propriétés> Propriétés de configuration> Éditeur de liens> Système

Sélectionnez Console (/ SUBSYSTEM: CONSOLE) en SubSystemoption ou vous pouvez simplement taper Console dans le champ de texte!

Maintenant essayez-le ... ça devrait marcher

Viraj
la source
Cela a fonctionné pour mon VS2013 Express, mais la réponse acceptée n'a pas fonctionné. Très étrange, car la réponse acceptée a fonctionné pour toutes les versions de Visual Studio que j'ai utilisées dans le passé.
Michael Calvin
9
@MichaelCalvin Vous devez exécuter avec Ctrl + F5 après avoir défini cela, c'est le kicker.
Jonathan Mee
comme @JonathanMee l'a déclaré, vous avez toujours exécuté Ctrl + F5. Cela a déjà été défini dans mon studio visuel 2015, donc la première réponse a été celle qui a le plus aidé.
C'est en effet correct. Le familier CTRL+F5échouera si, par exemple, vous ajoutez un nouveau fichier C ++ à un projet vide.
user2023370
A travaillé pour moi sur Visual Studio Express 2015. Merci.
LHC
44

Voici un moyen pour C / C ++:

#include <stdlib.h>

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

Mettez cela en haut de votre programme, et si c'est sur un système Windows ( #ifdef _WIN32), alors il créera une macro appelée WINPAUSE. Chaque fois que vous voulez que votre programme se mette en pause, appelez WINPAUSE;et il mettra le programme en pause, en utilisant la commande DOS. Pour d'autres systèmes comme Unix / Linux, la console ne doit de toute façon pas se fermer à la sortie du programme.

Shaun
la source
Cette méthode ne fonctionne pas dans Visual C ++ (sauf si vous incluez un en-tête?)
wmac
2
@wmac Vous devez inclure l'en-tête windows.h
Geowil
1
Je n'ai inclus aucune bibliothèque ni espace de noms mais cela fonctionne correctement, merci beaucoup.
Halil İbrahim Oymacı
1
Ne fais pas ça, s'il te plaît. La pausecommande est spécifique à Windows.
firegurafiku
A travaillé pour moi sur Visual Studio 2013 Express. :)
Anirban
32

Aller au menu de débogage -> Appuyez sur Démarrer sans débogage

pashaplus
la source
Ce n'est même pas une option dans VS 2008 à moins que l'environnement de développement C # n'ait été choisi. CTRL + F5 fonctionne cependant. Vous pouvez également l'ajouter en tant que bouton à la barre d'outils via Outils> Personnaliser.
perry
Si vous avez plusieurs projets, définissez celui qui convient comme projet de démarrage
CAD bloke
27

Si vous utilisez .NET, mettez Console.ReadLine()avant la fin du programme.

Il attendra <ENTER>.

Cheeso
la source
9
+1 - Soit cela, soit Console.ReadKey()simplement attendre n'importe quelle touche.
Fredrik Mörk
Bizarre, cela n'a aucun effet dans mon application. Il se ferme toujours sans attendre la saisie de l'utilisateur.
Kokodoko
4
Ensuite, votre code quitte probablement avant d'atteindre ce point.
En effet le
20

À partir de Visual Studio 2017 (15.9.4), il existe une option:

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

Le fragment correspondant de la documentation de Visual Studio :

Fermez automatiquement la console lorsque le débogage s'arrête:

Indique à Visual Studio de fermer la console à la fin d'une session de débogage.

chronoxor
la source
2
Je viens de tester cela dans VS2017 et VS2019. Cela nécessite à la fois de régler le sous-système sur CONSOLE et de désactiver cette option. Le fait d'avoir l'un ou l'autre ou aucun des deux ferme automatiquement la fenêtre.
Casey
Cela ferme encore la fenêtre pour moi si je lance plusieurs projets à partir de la même solution.
Serge Rogatch
Je pense que c'est la bonne réponse pour VS 2017 et les versions ultérieures. Dommage que ce ne soit pas dans les anciennes versions.
All the Rage
13

essayez d'appeler getchar()juste avant le main()retour.

Magarusu
la source
Ne fonctionne pas dans VS 2008 pour une application de console Hello Name simple. cout, cin, cout, getchar (), la console se ferme toujours. Quel est le problème?
perry
1
Essayez de mettre getchar () deux fois si vous avez un cout juste avant getchar (). getchar () attend un caractère et vous le donnez déjà avec cout ... Faites-moi savoir si cela aide :)
Magarusu
12

(/ SOUS-SYSTÈME: CONSOLE) n'a pas fonctionné pour mon vs2013 (je l'avais déjà).

"exécuter sans débogage" n'est pas une option, car je ne veux pas basculer entre le débogage et l'affichage de la sortie.

J'ai fini avec

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

Solution utilisée dans qtcreator pre 2.6. Maintenant que qt augmente, vs va dans l'autre sens. Si je me souviens bien, dans vs2008, nous n'avions pas besoin de telles astuces.

fantasme
la source
7

Voici une solution qui (1) ne nécessite aucun changement de code ou point d'arrêt, et (2) fait une pause après la fin du programme afin que vous puissiez voir tout ce qui a été imprimé. Il s'arrêtera après F5 ou Ctrl + F5. L'inconvénient majeur est que sur VS2013 Express (tel que testé), il ne charge pas les symboles, donc le débogage est très restreint.

  1. Créez un fichier batch. J'ai appelé le mien runthenpause.bat, avec le contenu suivant:

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

    La première ligne exécutera la commande que vous fournissez et jusqu'à huit arguments. La deuxième ligne va ... s'arrêter.

  2. Ouvrez les propriétés du projet | Propriétés de configuration | Débogage.

  3. Remplacez "Arguments de commande" par $(TargetPath)(ou tout ce qui se trouve dans "Commande").
  4. Remplacez «Command» par le chemin complet vers runthenpause.bat.
  5. Cliquez sur OK.

Maintenant, lorsque vous exécutez, runthenpause.batlancera votre application et, une fois votre application terminée, s'arrêtera pour que vous puissiez voir la sortie de la console.

Je publierai une mise à jour si je trouve comment charger les symboles. J'ai essayé /Z7par ceci mais sans succès.

cxw
la source
1
Cela ne prend toujours pas en charge le débogage, mais au moins cela résout le problème de ne pas pouvoir voir la sortie, par exemple de VLD, contrairement à toutes les autres réponses.
Martin Hennings
6

mettez simplement votre dernière ligne de code:

system("pause");
RefaelJan
la source
3

Vous pouvez exécuter votre exécutable à partir d'une invite de commande. De cette façon, vous pouvez voir toute la sortie. Ou, vous pouvez faire quelque chose comme ceci:

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

return YOUR_MAIN_CODE;

et de cette façon, la fenêtre ne se fermerait pas tant que vous n’auriez pas entré de données pour la avariable.

Géo
la source
3

ajouter «| pause ”dans la zone des arguments de commande sous la section de débogage des propriétés du projet.

l'ambiance
la source
4
Ce serait une excellente solution si cela fonctionnait. pausesemble fonctionner uniquement dans des fichiers batch, et bien qu'il reçoive des données de votre programme sur STDIN, il ne réimprime pas ce texte. J'ai essayé de le remplacer |par &&, mais cela n'a eu aucun effet - probablement parce qu'il ne s'exécute pas avec un shell de commande (cmd.exe).
Brian Vandenberg
3

Appuyez simplement sur CNTRL + F5 pour l'ouvrir dans une fenêtre de ligne de commande externe (Visual Studio n'en a pas le contrôle).

Si cela ne fonctionne pas, ajoutez ce qui suit à la fin de votre code:

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

Cela vous attend pour appuyer sur une touche pour fermer la fenêtre du terminal une fois que le code a atteint la fin.

Si vous voulez faire cela à plusieurs endroits, mettez le code ci-dessus dans une méthode (par exemple private void Pause()) et appelez Pause()chaque fois qu'un programme atteint une fin possible.

prudent maintenant1
la source
quand je fais le cntrl + f5, il s'ouvre puis se ferme immédiatement? comment corrigez-vous cela?
Callat
La deuxième solution était ce que je cherchais!
RoG
Lorsque je frappe Ctrl + F5, rien ne se passe. Ça fonctionnait pour moi mais tout d'un coup, ça a cessé de fonctionner.
Natasha
2

Une solution un peu meilleure:

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

au début de votre programme.

Avantages:

  • peut utiliser std :: exit ()
  • peut avoir plusieurs retours de la main
  • vous pouvez exécuter votre programme sous le débogueur
  • Indépendant de l'IDE (+ indépendant de l'OS si vous utilisez l' cin.sync(); cin.ignore();astuce au lieu de system("pause");)

Les inconvénients:

  • avoir à modifier le code
  • ne s'arrêtera pas sur std :: terminate ()
  • se produira toujours dans votre programme en dehors de la session IDE / débogueur; vous pouvez empêcher cela sous Windows en utilisant:

extern "C" int __stdcall IsDebuggerPresent(void);
int main(int argc, char** argv) {
    if (IsDebuggerPresent())
        atexit([] {system("PAUSE"); });
    ...
}
GhassanPL
la source
Très mauvais conseil.
Bravo et hth. - Alf
Pouvez-vous expliquer pourquoi?
GhassanPL
Dans le cas où l'on ne débogue pas, cela ne sert à rien, car dans ce cas il n'y a pas de problème à résoudre. Dans VS, exécutez simplement le programme avec Ctrl + F5 et c'est tout, donc il n'y a pas de problème dans VS, et dans un interpréteur de commandes, il n'y a pas de problème, bref, il n'y a pas de problème. Et dans le cas où l'on est en train de déboguer et que l'on veut arrêter un code ajouté pour s'arrêter n'est pas une solution plus pratique qu'un point d'arrêt, et interfère dans les situations où l'on ne veut pas d'arrêt.
Bravo et hth. - Alf
2

Soit utiliser:

  1. cin.get();

ou

  1. system("pause");

Assurez-vous de faire l'un d'eux à la fin de la main()fonction et avant l' returninstruction.

AAEM
la source
2

Vous pouvez également utiliser cette option

#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;
}
Vladimir Salguero
la source
2

Dans mon cas, j'ai vécu cela lorsque j'ai créé un projet Empty C ++ sur l'édition communautaire VS 2017. Vous devrez définir le sous-système sur "Console (/ SUBSYSTEM: CONSOLE)" sous Propriétés de configuration.

  1. Allez dans "Affichage" puis sélectionnez "Gestionnaire immobilier"
  2. Faites un clic droit sur le projet / la solution et sélectionnez "Propriété". Cela ouvre une page de propriétés de test
  3. Accédez à l'éditeur de liens, puis sélectionnez "Système"
  4. Cliquez sur "SubSystem" et une liste déroulante apparaît
  5. Choisissez "Console (/ SOUS-SYSTÈME: CONSOLE)"
  6. Postulez et économisez
  7. La prochaine fois que vous exécutez votre code avec "CTRL + F5", vous devriez voir la sortie.
Stephen Haruna
la source
0

Visual Studio 2015 , avec importations . Parce que je déteste quand les exemples de code ne donnent pas les importations nécessaires.

#include <iostream>;

int main()
{
    getchar();
    return 0;
}
JMI MADISON
la source