Comment arrêter la fermeture immédiate de l'application console C ++?

193

Dernièrement, j'ai essayé d'apprendre le C ++ à partir de ce site Web . Malheureusement, chaque fois que j'essaie d'exécuter l'un des exemples de code, je vois ce programme s'ouvrir pendant environ une demi-seconde, puis se fermer immédiatement. Existe-t-il un moyen d'empêcher la fermeture immédiate du programme afin que je puisse voir les fruits de mes efforts?

Adam P
la source
5
Double-cliquez-vous sur l'exécutable? Travaillez-vous sous Windows? Pourquoi ne travaillez-vous pas à partir du shell de commandes et ne tapez-vous pas les commandes comme vous voulez qu'elles soient exécutées?
S.Lott
8
@S Lott: Parce que si vous appuyez sur le bouton "Go" dans votre IDE, vous n'avez pas besoin de vous embêter avec une console.
Billy ONeal
4
Vous devriez envisager d'obtenir un bon livre pour apprendre le C ++. Les sites Web sont de bonnes ressources, mais ne correspondent pas à un bon texte d'introduction. Il y a une liste définitive de livres C ++ ici: stackoverflow.com/questions/388242/…
James McNellis
6
@Billy Si le fait d'appuyer sur le bouton Go ferme l'application lorsqu'elle se termine, vous utilisez le mauvais IDE.
2
Demandé et répondu précédemment ici: stackoverflow.com/questions/902261/… , bien que celui-ci ait un meilleur titre.
dmckee --- chaton ex-modérateur

Réponses:

121

Edit: comme Charles Bailey le souligne à juste titre dans un commentaire ci-dessous, cela ne fonctionnera pas s'il y a des personnages en mémoire tampon stdin, et il n'y a vraiment pas de bon moyen de contourner cela. Si vous utilisez un débogueur attaché, la solution suggérée par John Dibling est probablement la solution la plus propre à votre problème.

Cela dit, je vais laisser cela ici et peut-être que quelqu'un d'autre le trouvera utile. Je l'ai beaucoup utilisé comme hack rapide lors de l'écriture de tests pendant le développement.


À la fin de votre mainfonction, vous pouvez appelerstd::getchar();

Cela obtiendra un seul caractère stdin, vous donnant ainsi le type de comportement "appuyez sur n'importe quelle touche pour continuer" (si vous voulez réellement un message "appuyez sur n'importe quelle touche", vous devrez en imprimer un vous-même).

Vous devez #include <cstdio>pour getchar.

James McNellis
la source
15
getcharne résout pas le problème - ou seulement dans des circonstances limitées, du moins. Il lit un caractère à partir de stdin, mais s'il y a déjà des caractères mis en mémoire tampon à partir de stdin, le programme continuera sans attendre, que vous imprimiez une invite ou non.
CB Bailey
1
@Charles: Un bon point. Ignorer jusqu'à \nest une solution partielle, mais n'aidera pas si plusieurs lignes d'entrée sont mises en mémoire tampon. Je ne connais pas de méthode C ++ standard pour tout effacer d'un flux d'entrée. : - /
James McNellis
1
@James: Vieux, mais qu'en est-il std::cin.ignore(std::cin.rdbuf()->in_avail());? Je l'ai d' ici .
GManNickG
1
Une option que j'utilise beaucoup est std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');avec #include <limits>.
Xeo
5
Veuillez ne pas faire ça. :( Cela ne fait pas partie de la fonction de votre programme pour le faire.
Courses de légèreté en orbite
138

Si vous utilisez Visual Studio et que vous démarrez l'application console à partir de l'EDI:

appuyer sur CTRL-F5 (démarrer sans débogage) démarrera l'application et gardera la fenêtre de la console ouverte jusqu'à ce que vous appuyiez sur une touche.

nabulke
la source
1
Vous démarrez la console depuis l'IDE? Comment et pourquoi feriez-vous cela?
CodyBugstein
1
Excellent, ça a marché. Pourquoi n'est-ce pas le comportement par défaut de Visual Studio?
Luminaire
J'ai également pensé que c'était la façon de le faire, jusqu'à aujourd'hui, quand je construisais un programme de console simple et que la méthode ci-dessus ne fonctionnait pas :(
KansaiRobot
1
Existe-t-il une version de ceci avec le débogage?
luckyging3r
109

La solution de James fonctionne pour toutes les plateformes.

Alternativement, Windowsvous pouvez également ajouter les éléments suivants juste avant de revenir de la mainfonction:

  system("pause");

Cela exécutera la pausecommande qui attend que vous appuyiez sur une touche et affiche également un joli messagePress any key to continue . . .

codaddict
la source
2
Cela ressemble à une variation Rube Goldberg d'une solution.
Dave Van den Eynde
4
@Dave Van den Eynde: C'est également assez courant et est fourni en standard dans le code passe-partout dans DevCPP. +1
Billy ONeal
4
@Dave, d'autre part, il indique clairement qu'il ne s'agit que d'un bodge pour un exemple, tandis que std: getch pourrait être accidentellement laissé dans le code réel.
Martin Beckett
2
Il s'agit d'une solution parfaitement valable pour ceux sous Windows. Bien que ce ne soit pas idéal, cela fonctionne
thecoshman
Solution la plus simple et la plus rapide. Juste ce dont j'avais besoin
CodyBugstein
83

Si vous utilisez Visual C ++ 2010 Express de Microsoft et rencontrez le problème avec CTRL + F5 ne fonctionnant pas pour garder la console ouverte après la fin du programme, jetez un œil à ce thread MSDN .

Votre IDE est probablement configuré pour fermer la console après une exécution CTRL + F5; en fait, un «projet vide» dans Visual C ++ 2010 ferme la console par défaut. Pour changer cela, faites comme suggéré par le modérateur Microsoft:

Cliquez avec le bouton droit sur le nom de votre projet et accédez à la page Propriétés, développez Propriétés de configuration -> Éditeur de liens -> Système, sélectionnez Console (/ SUBSYSTEM: CONSOLE) dans la liste déroulante Sous-système. Parce que, par défaut, le projet vide ne le spécifie pas.

M. Underhill
la source
1
Et si ce n'est pas une application console?
Jesse Pepper
3
@ Mr.Underhill Cela ne fonctionnera que si vous lancez sans le débogueur (Ctrl + F5).
Jonathan Mee
En plus d'être la seule solution non piratée, c'est également le seul moyen de voir les impressions des destructeurs d'objets de la pile principale.
Poniros
20

Je mets habituellement juste un point d'arrêt sur main()l'accolade bouclée de fermeture. Lorsque la fin du programme est atteinte par quelque moyen que ce soit, le point d'arrêt va frapper et vous pouvez ALT-Tab à la fenêtre de la console pour afficher la sortie.

John Dibling
la source
14

Pourquoi ne pas simplement exécuter le programme à partir d'une console, c'est-à-dire exécuter le programme à partir de cmd.exe si vous utilisez Windows. De cette façon, la fenêtre reste ouverte après la fin du programme.

[EDIT]: Lorsque j'utilise KDevelop4, il y a une instance à part entière de Bash (une CLI Linux) fonctionnant dans un onglet au bas de l'IDE. C'est ce que j'utilise dans ce genre de circonstances.

Amos
la source
3
Parce que si vous utilisez un IDE, vous n'utilisez généralement pas de console. Vous poussez, le programme s'exécute, et c'est tout.
Billy ONeal
3
Tout IDE compétent gardera la console à l'écran lorsque l'application se terminera - Code :: Blocks, par exemple, fait exactement cela.
3
@nobugz: Je l'ai compris. Pour que la fenêtre reste, vous devez avoir / SUBSYSTEM: CONSOLE sur la ligne de commande de l'éditeur de liens. La documentation indique que c'est la valeur par défaut si mainest définie, mais si je ne la place pas explicitement sur la ligne de commande, VS tue la fenêtre lorsque l'application se ferme. soupir
James McNellis
2
@James: cela est nécessaire pour obtenir une fenêtre de console en premier lieu. Cela nécessite à son tour main () au lieu de WinMain (), et non l'inverse. Je suis un peu perdu ...
Hans Passant
4
@nobugz: Si vous démarrez à partir d'un "projet vide" au lieu d'une "application console Win32", le sous-système n'est pas explicitement défini dans les propriétés du projet. Si vous définissez maindans le projet, l'éditeur de liens utilise par défaut le sous-système CONSOLE. Lors du débogage ou de l'exécution, vous obtiendrez une fenêtre de console. Toutefois, sauf si vous spécifiez explicitement CONSOLE comme sous-système dans les propriétés du projet, Visual Studio ne gardera pas la fenêtre de console ouverte. Je pars toujours d'un projet vide et je modifie rarement les propriétés d'un projet individuel, donc je n'ai jamais vu la fenêtre de la console rester. Désolé pour la confusion
James McNellis
9

Avant la fin de votre code, insérez cette ligne:

system("pause");

Cela gardera la console jusqu'à ce que vous appuyiez sur une touche.

#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
la source
Il a également imprimé "Appuyez sur n'importe quelle touche pour continuer ...". pour moi.
PapaHotelPapa,
8

Appelez cin.get();2 fois:

    //...
    cin.get();
    cin.get();
    return 0
}
tsx
la source
6
mais pourquoi deux fois ??
Madhawa Priyashantha
que faire si nous avons besoin d'un autre cin.get () pour obtenir par exemple une chaîne dans un tableau avant cela? Cela ne fonctionne pas dans ce scénario.
QMaster
4

Si vous exécutez votre code à partir d'un IDE compétent, tel que Code :: Blocks , l'IDE gérera la console qu'il utilise pour exécuter le code, en le gardant ouvert à la fermeture de l'application. Vous ne voulez pas ajouter de code spécial pour garder la console ouverte, car cela l'empêchera de fonctionner correctement lorsque vous l'utiliserez pour de vrai, en dehors de l'EDI.


la source
3

D'accord, je suppose que vous utilisez Windows avec Visual Studio ... pourquoi? Eh bien parce que si vous utilisez un système d'exploitation Linux, vous l'exécuterez probablement à partir de la console.

Quoi qu'il en soit, vous pouvez ajouter de la merde à la fin de votre programme comme d'autres le suggèrent, ou vous pouvez simplement appuyer sur CTRL + F5 (démarrer sans débogage) et Visual Studio quittera la console une fois terminée.

Une autre option si vous souhaitez exécuter la version de débogage sans ajouter de conneries à votre code consiste à ouvrir la fenêtre de la console (Démarrer -> Exécuter -> cmd) et à naviguer vers votre répertoire de sortie de débogage . Ensuite, entrez simplement le nom de votre exécutable et il exécutera votre programme de débogage dans la console. Vous pouvez ensuite utiliser l'attachement de Visual Studio pour traiter ou quelque chose si vous le souhaitez vraiment.

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

using namespace std;

int main()
{

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

    return 0;
}

Je n'ai pas remarqué que quelqu'un d'autre a posté cela, alors le voici.

Ruan
la source
J'ajouterais qu'il conio.hs'agit d'un en-tête spécifique à Windows et peut ne pas être disponible sur toutes les machines (ou vous devrez peut-être le lier séparément, ce qui est exagéré).
Yksisarvinen
Travail. juste besoin de changer getch (); à _getch (); depuis qu'il est devenu obsolète
ncesar
2

Si vous déboguez réellement votre application dans Visual C ++, appuyez sur F5 ou sur le triangle vert de la barre d'outils. Si vous ne le déboguez pas vraiment (vous n'avez pas de points d'arrêt définis), appuyez sur Ctrl + F5 ou choisissez Démarrer sans débogage dans les menus (c'est généralement dans le menu Déboguer, ce qui, je le reconnais, prête à confusion). Ce sera un peu plus rapide, et plus important pour vous, s'arrêtera à la fin sans que vous ayez à changer votre code.

Sinon, ouvrez une invite de commande, accédez au dossier où se trouve votre exe et exécutez-le en tapant son nom. De cette façon, une fois l'exécution terminée, l'invite de commande ne se ferme pas et vous pouvez voir la sortie. Je préfère ces deux méthodes à l'ajout de code qui arrête l'application au moment où elle est terminée.

Kate Gregory
la source
2

Ajoutez simplement ce qui suit à la fin de votre programme. Il essaiera de capturer une certaine forme d'entrée utilisateur, empêchant ainsi la console de se fermer automatiquement.

cin.get();
Bat_Programmer
la source
2

Ajoutez les lignes suivantes avant toute exit()fonction ou avant tout returns dans main():

std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");
Thomas Matthews
la source
Cela ne fonctionne pas pour moi, la première ligne fonctionne mais appuyer sur Entrée ne fait rien
Qwertie
2

Pour Visual Studio (et uniquement Visual Studio), l'extrait de code suivant vous donne une invite `` attendre que la pression sur la touche continue '' qui attend vraiment que l'utilisateur appuie explicitement sur une nouvelle touche, en vidant d'abord le tampon d'entrée:

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

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

Notez que cela utilise les tchar.hmacros pour être compatible avec plusieurs «jeux de caractères» (comme VC ++ les appelle).

MicroVirus
la source
2

Je fais juste ceci:

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

Remarque: l'effacement du tampon cin et ainsi de suite n'est nécessaire que si vous avez utilisé cin à un moment donné plus tôt dans votre programme. Utiliser également std :: numeric_limits :: max () est probablement mieux que INT_MAX, mais c'est un peu verbeux et généralement inutile.

GuestPerson00001
la source
Cela fonctionne, mais le retour 0; ne s'exécutera pas si j'utilise ce code.
wernersbacher
2

Utilisez #include "stdafx.h"& system("pause");comme le code ci-dessous.

#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
la source
systemest déclaré en <cstdlib>, non stdafx.h.
melpomene
1

Idée similaire à yeh réponse, juste solution minimaliste.

Créez un fichier de commandes avec le contenu suivant:

helloworld.exe
pause

Utilisez ensuite le fichier batch.

Cœur
la source
1

simplement

#include <cstdio>

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

pour une raison quelconque, il est généralement possible de lire 1 caractère avec getchar déjà dans stdin lorsque vous exécutez un programme. donc le premier getchar lit ce caractère, et le second getchar attend l'entrée utilisateur (votre) avant de quitter le programme. Et après qu'un programme quitte la plupart des terminaux, en particulier sur Windows, fermez immédiatement le terminal. donc ce que nous visons est un moyen simple d'empêcher un programme de se terminer après avoir tout sorti. Bien sûr, il existe des moyens plus complexes et plus propres de résoudre ce problème, mais c'est le plus simple.

Dmitriy Suserov
la source
2
Veuillez ajouter au moins une courte explication des raisons pour lesquelles cela résout le problème.
kaya3
0

Vérifiez si votre IDE a une case à cocher dans le paramètre de projet pour garder la fenêtre ouverte après la fin du programme. Sinon, utilisez std::cin.get();pour lire un caractère à la fin de la fonction principale. Cependant, assurez-vous d'utiliser uniquement une entrée basée sur la ligne (std :: getline) ou de traiter les restes de caractères non lus sinon (std :: ignore jusqu'à la nouvelle ligne) car sinon le .get () à la fin ne lira que les ordures que vous avez laissées non lu plus tôt.

Tronic
la source
0

Cela semble bien fonctionner:

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

Si vous effacez d'abord le tampon, ce ne sera pas un problème lorsque vous lirez le suivant. Pour une raison quelconque, cin.ignore(1)cela ne fonctionne pas, il doit être 2.

Northcode
la source
1
2 n'est parfois pas suffisant non plus (lorsqu'il y a plus de frappes en attente). La bonne façon est d'ignorer autant de caractères que dans la file d'attente. Pour avec cin.rdbuf()->in_avail,. Pas un nombre magique comme 1 ou 2.
Konrad Rudolph
0

Vous pouvez toujours simplement créer un fichier de commandes. Par exemple, si votre programme s'appelle helloworld.exe, du code serait:

@echo off
:1
cls
call helloworld.exe
pause >nul
goto :1
ouais
la source
0

Si vous exécutez Windows, vous pouvez faire system("pause >nul");ou system("pause");. Il exécute une commande de console pour suspendre le programme jusqu'à ce que vous appuyiez sur une touche. >null'empêche de dire Press any key to continue....

PatThaCoder
la source
0

Je mets un point d'arrêt au dernier retour 0 du programme. Ça fonctionne bien.

lierosk
la source
1
Cela ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous son article - vous pouvez toujours commenter vos propres articles, et une fois que vous aurez une réputation suffisante, vous pourrez commenter n'importe quel article .
Ravi Dhoriya
1
Comment cela ne fournit-il pas de réponse? Im dans exactement la même situation comme auteur d'une question et cela aide.
lierosk
0

J'ai utilisé cin.get()et cela fonctionne, mais un jour, j'ai dû en utiliser un autre cin.get([Array Variable])avant cela pour saisir une chaîne ling avec un caractère vide au milieu de. la cin.get()fenêtre d'invite de commande n'a donc pas été fermée. Enfin, j'ai trouvé une autre façon: appuyez sur CTRL + F5 pour ouvrir dans une fenêtre externe et Visual Studio n'a plus de contrôle sur elle. Je vais juste vous poser des questions sur la fermeture après l'exécution des dernières commandes.

QMaster
la source
0

J'ai essayé de mettre une getchar()fonction à la fin. Mais ça n'a pas marché. J'ai donc ajouté deux getchar()fonctions l'une après l'autre. Je pense que le premier getchar()absorbe la Entertouche sur laquelle vous appuyez après la dernière entrée de données. Essayez donc d'ajouter deux getchar()fonctions au lieu d'une

Nathan Tuggy
la source
0

Au lieu d'appuyer sur le bouton d'exécution, appuyez sur CTRL et F5 en même temps, il vous donnera la touche n'importe quelle touche pour continuer le message. Ou tapez "(avertissement utilisez ceci uniquement pour tester des programmes non réels car un antivirus ne l'aime pas !!!!)" à la fin de votre fonction principale mais: (avertissement utilisez ceci uniquement pour tester des programmes non réels comme un antivirus ne le faites pas 'aime pas !!!!)

anony
la source
0

utilisez simplement cin.ignore () juste avant de retourner 0; deux fois

main()
  {
  //your codes 

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

  return 0;
  }

c'est tout

Kursat Turkay
la source
Je fais normalement quelque chose comme ça. cin.ignore (); cin.get ();
aj.toulan
-1

Il vous suffit de définir une variable pour x, puis de la saisir avant le retour 0;

cout<<"\nPress any key and hit enter to end...";
cin>>x;
Conseils amicaux
la source
-1

Vous pouvez même déclarer un entier au début de votre main()fonction (disons int a;) et le mettre std::cin >> a;juste avant la valeur de retour. Ainsi, le programme continuera de fonctionner jusqu'à ce que vous appuyiez sur une touche et entriez.

Izza
la source