web-dev-qa-db-fra.com

Comment arrêter l'application console C ++ de quitter immédiatement?

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, ce programme est ouvert pendant environ une demi-seconde, puis se ferme immédiatement. Y a-t-il un moyen d'empêcher la fermeture immédiate du programme afin que je puisse voir les fruits de mes efforts?

183
Adam P

Edit: Comme Charles Bailey le souligne à juste titre dans un commentaire ci-dessous, cela ne fonctionnera pas s'il y a des caractères mis en mémoire tampon dans stdin, et vraiment pas un bon moyen de contourner cela. Si vous utilisez un débogueur attaché, 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 le trouvera utile. Je l'ai souvent utilisée comme une sorte de moyen rapide lors de la rédaction de tests au cours du développement.


À la fin de votre fonction main, vous pouvez appeler std::getchar();

Cela donnera un caractère unique de 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 une touche", vous devrez en imprimer un vous-même).

Vous devez #include <cstdio> pour getchar.

114
James McNellis

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

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

135
nabulke

La solution de James fonctionne pour toutes les plateformes.

Alternativement sur Windows, vous pouvez également ajouter ce qui suit juste avant de revenir de la fonction main:

  system("pause");

Ceci exécutera la commande pause qui attend que vous appuyiez sur une touche et affiche également un message de Nice Press any key to continue . . .

100
codaddict

Si vous utilisez Visual C++ 2010 Express de Microsoft et rencontrez le problème avec CTRL + F5 ne fonctionne pas pour garder la console ouverte après la fin du programme, prenez un coup d'oeil à ce thread MSDN .

Il est probable que votre IDE soit configuré pour fermer la console après une exécution de CTRL + F5; en fait, un "projet vide" dans Visual C++ 2010 ferme la console par défaut. Pour changer cela, suivez les recommandations du modérateur de Microsoft:

Cliquez avec le bouton droit de la souris sur le nom de votre projet et allez à 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.

78
Mr. Underhill

En général, je pose simplement un point d'arrêt sur l'accolade fermante de main(). Lorsque la fin du programme est atteinte, quel que soit le moyen utilisé, le point d'arrêt frappe et vous pouvez ALT-Tab vers la fenêtre de la console pour afficher le résultat.

18
John Dibling

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 à la fin du programme.

[EDIT]: Lorsque j'utilise KDevelop4, une instance à part entière de Bash (une CLI Linux) s'exécute dans un onglet au bas de l'EDI. C'est ce que j'utilise dans ce genre de circonstances.

14
Amos

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
}
9
robert

Appelez cin.get(); 2 fois:

    //...
    cin.get();
    cin.get();
    return 0
}
8
tsx

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

4
anon

D'accord, je suppose que vous utilisez Windows sous Visual Studio ... Pourquoi? Eh bien, car 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 le suggèrent d'autres personnes, 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 la merde à votre code consiste à ouvrir la fenêtre de la console (Démarrer -> Exécuter -> cmd) et à accéder à votre répertoire de sortie du débogage. Ensuite, entrez simplement le nom de votre exécutable et il lancera votre programme de débogage dans la console. Vous pouvez ensuite utiliser l'attachement de Visual Studio pour traiter ou quelque chose si vous voulez vraiment.

3
Polaris878

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");
}
2
Mohammed Nouh

Si vous déboguez 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 défini de points d'arrêt), appuyez sur Ctrl + F5 ou choisissez Démarrer sans débogage dans les menus (c'est généralement dans le menu Débogage, ce qui est déroutant, à mon avis.) Ce sera un peu plus rapide, et plus important encore pour vous, fera une pause à la fin sans que vous ayez à changer votre code.

Sinon, ouvrez une invite de commande, naviguez jusqu'au dossier où se trouve votre exe et exécutez-le en tapant son nom. Ainsi, lorsque vous avez terminé, la commande Invite 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 telle qu'elle est terminée.

2
Kate Gregory

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

std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");
2
Thomas Matthews

Pour Visual Studio (et uniquement Visual Studio), l'extrait de code suivant vous indique "Attendre que vous continuiez d'appuyer sur une touche pour continuer". Invite qui attend réellement que l'utilisateur appuie explicitement sur une nouvelle clé, 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 la macro tchar.h pour être compatible avec plusieurs "jeux de caractères" (comme les appelle VC++).

2
MicroVirus

Je fais juste ça:

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

Remarque: effacer la mémoire tampon cin et cela n’est nécessaire que si vous avez déjà utilisé cin à un moment de votre programme. Également utiliser std :: numeric_limits :: max () est probablement meilleur que INT_MAX, mais c'est un peu verbeux et généralement inutile.

2
GuestPerson00001
#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é ça alors le voici.

2
Ruan

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

cin.get();
2
Bat_Programmer

Idée similaire à la réponse yeh, juste une alternative minimaliste.

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

helloworld.exe
pause

Ensuite, utilisez le fichier de commandes.

1
Cœur

simplement

int main(){
    // code...
    getchar();
    getchar();
    return 0;
}
0
Dmitriy Suserov

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

0
lierosk

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

0
PatThaCoder

utilisez juste cin.ignore () juste avant le retour 0; deux fois

main()
  {
  //your codes 

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

  return 0;
  }

c'est tout

0
Kursat Turkay

Au lieu d'appuyer sur le bouton Exécuter, appuyez simultanément sur CTRL et F5. Vous pourrez appuyer sur n'importe quelle touche pour continuer le message. Ou tapez "(attention utilisez ceci uniquement pour tester des programmes non réels car un antivirus ne vous plaît pas !!!!)" à la fin de votre fonction principale, mais: (avertissement utilisez ceci uniquement pour tester des programmes non réels en tant qu'antivirus pas comme ça !!!!)

0
anony

Vérifiez si votre IDE dispose d'une case à cocher dans les paramètres du projet pour que la fenêtre reste ouverte une fois le programme terminé. Sinon, utilisez std::cin.get(); pour lire un caractère à la fin de la fonction principale. Cependant, veillez à n'utiliser que des entrées linéaires (std :: getline) ou à gérer les caractères non lus restants (std :: ignore jusqu'à la nouvelle ligne), sinon le .get () à la fin ne lira que les ordures que vous avez laissées. non lu plus tôt.

0
Tronic

J'ai utilisé cin.get() et cela a fonctionné, mais un jour, j’avais besoin d’utiliser un autre cin.get([Array Variable]) auparavant pour saisir une chaîne ling avec un caractère vide au milieu. de sorte que cin.get() n'a pas empêché la fenêtre d'invite de commande de se fermer. Enfin, j’ai trouvé un autre moyen: appuyez sur CTRL + F5 pour l’ouvrir dans une fenêtre externe. Visual Studio n’a plus aucun contrôle sur celle-ci. Nous vous demanderons simplement si vous souhaitez fermer après l'exécution des dernières commandes.

0
QMaster

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

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

Cela semble bien fonctionner:

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

Si vous effacez le tampon en premier, le problème ne se posera pas lorsque vous lirez le suivant. Pour une raison quelconque, cin.ignore(1) ne fonctionne pas, il doit être 2.

0
Northcode

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

0
user5657236