système («pause»); - Pourquoi est-ce mal?

131

Voici une question que je ne comprends pas très bien:

La commande system("pause");est enseignée aux nouveaux programmeurs comme un moyen de mettre en pause un programme et d'attendre qu'une entrée clavier se poursuive. Cependant, de nombreux programmeurs chevronnés semblent mal percevoir cela comme quelque chose qui ne devrait pas être fait à des degrés divers.

Certaines personnes disent qu'il est bon à utiliser. Certains disent qu'il ne doit être utilisé que lorsque vous êtes enfermé dans votre chambre et que personne ne vous regarde. Certains disent qu'ils viendront personnellement chez vous et vous tueront si vous l'utilisez.

Je suis moi-même un nouveau programmeur sans formation formelle en programmation. Je l'utilise car on m'a appris à l'utiliser. Ce que je ne comprends pas, c'est que si ce n'est pas quelque chose à utiliser, pourquoi m'a-t-on appris à l'utiliser? Ou, d'un autre côté, est-ce vraiment pas si mal après tout?

Quels sont vos avis sur ce sujet?

Faux
la source
en relation: stackoverflow.com/questions/900666/…
Gordon Gustafson
5
Apparemment, les gens aiment leurs appels à faire une pause pour être vraiment efficaces. En d'autres termes, "Dépêchez-vous et arrêtez!"
Lee Louviere
63
On vous l'a appris parce que généralement les enseignants sont de mauvais programmeurs
qui
Veuillez lire ces conseils pour poser les bonnes questions: [ Comment poser ], [Rédiger la question parfaite ].
Adi Inbar
9
@wich complètement absurde.
Michael Chourdakis

Réponses:

85

C'est mal vu car il s'agit d'un hack spécifique à la plate-forme qui n'a rien à voir avec l'apprentissage de la programmation, mais plutôt pour contourner une fonctionnalité de l'IDE / OS - la fenêtre de console lancée à partir de Visual Studio se ferme lorsque le programme a terminé son exécution, et ainsi de suite. le nouvel utilisateur ne voit pas la sortie de son nouveau programme.

Esquiver dans le système ("pause") exécute le programme de "pause" en ligne de commande de Windows et attend que cela se termine avant de continuer l'exécution du programme - la fenêtre de la console reste ouverte afin que vous puissiez lire la sortie.

Une meilleure idée serait de mettre un point d'arrêt à la fin et de le déboguer, mais cela pose encore des problèmes.

ravuya
la source
6
Visual Studio peut exécuter le programme dans deux modes: avec ou sans débogage. Lorsqu'il est exécuté en mode de débogage, il s'arrête au premier point d'arrêt. Si vous n'en avez pas défini, il exécutera le programme et fermera la console. Donc, si vous voulez que le programme de la console s'arrête, définissez simplement un point d'arrêt ou, mieux encore, exécutez-le sans débogage! Cela exécutera le programme et arrêtera la console.
Ivan Mesic
Ce n'est pas seulement une fonctionnalité de Visual Studio - si vous exécutez un programme de console à partir de Windows (c'est-à-dire au lieu de charger une invite de commande et de l'exécuter à partir de là), il se fermera également une fois son exécution terminée.
JBentley
2
−1 Re «la fenêtre de la console lancée depuis Visual Studio se ferme lorsque le programme a terminé son exécution», non, uniquement lorsque le programme est exécuté dans le débogueur. Re "exécute le programme" pause "en ligne de commande Windows, non il n'y en a pas ( pauseest une commande interne dans cmd.exe). La liste des meilleures idées fait également cruellement défaut.
Bravo et hth. - Alf
Je pense que cette réponse est la seule qui touche à l'aspect qu'il s'agit d'une solution de contournement. Il fonctionne autour du comportement d'un environnement d'exécution spécifique qui ferme une fenêtre de terminal avant de pouvoir lire la sortie du programme. Ce que vous devez faire, c'est réparer cet environnement. Si cela ne peut pas être fait, utilisez cette solution de contournement, éventuellement uniquement si IsDebuggerPresent()renvoie true et documentez correctement cette solution de contournement («pourquoi ce code est-il ici?»).
Ulrich Eckhardt le
43

C'est lent. Cela dépend de la plate-forme. Ce n'est pas sûr.

Premièrement: ce qu'il fait. Appeler «système» revient littéralement à taper une commande dans l'invite de commande Windows. Il y a une tonne de configuration et de démontage pour que votre application fasse un tel appel - et la surcharge est tout simplement ridicule.

Et si un programme appelé "pause" était placé dans le PATH de l'utilisateur? Le simple fait d'appeler system ("pause") garantit seulement qu'un programme appelé "pause" est exécuté (espérons que vous n'avez pas votre exécutable nommé "pause"!)

Écrivez simplement votre propre fonction "Pause ()" qui utilise _getch. OK, bien sûr, _getch dépend également de la plate-forme (note: il est défini dans "conio.h") - mais c'est beaucoup plus agréable que system()si vous développez sous Windows et cela a le même effet (bien qu'il soit de votre responsabilité de fournir le texte avec cout ou plus).

En gros: pourquoi introduire autant de problèmes potentiels alors que vous pouvez simplement ajouter deux lignes de code et une include et obtenir un mécanisme beaucoup plus flexible?

Jonathan Leffler
la source
61
Pour quelqu'un qui se plaint de la dépendance de la plate-forme, cela semble étrange à suggérer _getch, surtout lorsque le C ++ standard le fournit getchar.
paxdiablo
33
je ressens une certaine ironie dans le calcul des frais généraux pour l'interaction avec un humain)
ShPavel
1
@Spagpants: Vous ne comprenez peut-être pas la différence entre obtenir la contribution d'un humain et générer des images et des sons chez un humain.
yzt
1
@ Cheersandhth.-Alf - Hm? Quand j'ai écrit ceci, il y a 8 ans, je venais de terminer le débogage d'un problème causé par 'system ("pause")' parce que le nom de l'exécutable du projet s'appelait "pause" et il entrerait dans une boucle infinie. Mon argument tient toujours, je ne sais pas pourquoi vous dites que je me suis trompé.
2
@paxdiablo getchar nécessite une entrée, puis appuyez sur Entrée. _getch ne nécessite qu'une simple pression sur une touche, quelle que soit la clé. Pour émuler _getch sur Linux, vous avez besoin de 5 à 6 lignes de code pour changer le mode de la console, puis le remettre par défaut. Ce n'est pas la même chose, ça fait des choses différentes. getchar ne remplace pas _getch.
Barnack
29
  • lent: il doit sauter à travers beaucoup de code Windows inutile et un programme séparé pour une opération simple
  • non portable: dépend du programme de pause
  • pas bon style: faire un appel système ne doit être fait que lorsque cela est vraiment nécessaire
  • plus de frappe: System ("pause") est plus long que getchar ()

un simple getchar () devrait faire l'affaire.

Gavin H
la source
26

Utiliser system("pause");is Ungood Practice ™ parce que

  • C'est complètement inutile .
    Pour garder la fenêtre de console du programme ouverte à la fin lorsque vous l'exécutez à partir de Visual Studio, utilisez Ctrl+ F5pour l'exécuter sans débogage, ou bien placez un point d'arrêt à la dernière accolade droite }de main. Donc, pas de problème dans Visual Studio. Et bien sûr, aucun problème lorsque vous l'exécutez à partir de la ligne de commande.

  • C'est problématique et ennuyeux
    lorsque vous exécutez le programme à partir de la ligne de commande. Pour une exécution interactive, vous devez appuyer sur une touche à la fin sans aucun but. Et pour une utilisation dans l'automatisation de certaines tâches qui pausesont très indésirables!

  • Ce n'est pas portable.
    Unix-land n'a pas de pausecommande standard .

La pausecommande est une cmd.execommande interne et ne peut pas être remplacée, comme cela est affirmé à tort dans au moins une autre réponse. C'est-à-dire que ce n'est pas un risque pour la sécurité, et l'affirmation selon laquelle les programmes AV le diagnostiquent en tant que tel est aussi douteuse que l'affirmation de passer outre la commande (après tout, un programme C ++ invoquant systemest en mesure de faire tout ce que l'interpréteur de commandes peut faire, et plus). De plus, bien que cette façon de faire une pause soit extrêmement inefficace par rapport aux normes habituelles de la programmation C ++, cela n'a pas du tout d'importance à la fin du programme d'un novice.

Donc, les affirmations dans la horde de réponses avant cela ne sont pas correctes, et la principale raison pour laquelle vous ne devriez pas utiliser system("pause") ou toute autre commande d'attente à la fin de votre main, est le premier point ci-dessus: c'est complètement inutile, cela ne sert absolument à rien , c'est juste très idiot.

Bravo et hth. - Alf
la source
1
Parfois, un Ungood Practice ™ est nécessaire pour des tests rapides ... ce que nous appelons "rapide et sale"
Michael Haephrati
22

En résumé, il doit interrompre l'exécution des programmes, effectuer un appel système et allouer des ressources inutiles lorsque vous pourriez utiliser quelque chose d'aussi simple que cin.get (). Les gens utilisent System ("PAUSE") parce qu'ils veulent que le programme attende jusqu'à ce qu'ils appuient sur Entrée pour pouvoir voir leur sortie. Si vous voulez qu'un programme attende une entrée, il existe des fonctions intégrées pour ce qui sont également multiplateformes et moins exigeantes.

Plus d'explications dans cet article.

John T
la source
Wow, encore toi! vivez-vous ici? lol Quoi qu'il en soit, merci, je vais faire un peu de lecture. En attendant, que pensez-vous de cette question?
Faken le
J'ai eu cette même question quand j'ai commencé C il y a quelques années, et on m'a pointé vers ce même article. J'utilise getchar () personnellement.
John T
Ho wow ... Je n'ai pas fait de C ++ depuis un moment mais ouais .. il y a définitivement de meilleures façons d'obtenir les mêmes résultats
Newtopian
16

Vous pouvez utiliser à std::cin.get()partir de iostream:

#include <iostream> // std::cout, std::cin
using namespace std;

int main() {
   do {
     cout << '\n' << "Press the Enter key to continue.";
   } while (cin.get() != '\n');

   return 0;
}

D' ailleurs, system('pause')est lent, et comprend un fichier que vous n'avez probablement pas besoin: stdlib.h. Il dépend de la plate-forme et appelle en fait un système d'exploitation «virtuel».

Feria de Gavriel
la source
3
On m'a appris à utiliser System("pause")dans un cours de programmation de première année, mais je voulais pouvoir exécuter mes programmes sur mon Mac, donc j'ai dû en apprendre davantage cin.get().
daviewales
10

Parce qu'il n'est pas portable.

pause

est un programme Windows / DOS uniquement, donc votre code ne fonctionnera pas sous Linux. De plus, ce systemn'est généralement pas considéré comme un très bon moyen d'appeler un autre programme - il est généralement préférable d'utiliser CreateProcessou forkou quelque chose de similaire.

a_m0d
la source
4

Comme indiqué dans les autres réponses, il existe de nombreuses raisons que vous pouvez trouver pour éviter cela. Tout se résume à une raison qui rend le reste sans objet. La System()fonction est intrinsèquement non sécurisée / non approuvée et ne doit pas être introduite dans un programme à moins que cela ne soit nécessaire.

Pour un devoir d'étudiant, cette condition n'a jamais été remplie, et pour cette raison, j'échouerais un devoir sans même exécuter le programme si un appel à cette méthode était présent. (Cela a été précisé dès le début.)

Sam Harwell
la source
4

Pour moi, cela n'a pas de sens en général d'attendre avant de sortir sans raison. Un programme qui a fait son travail devrait simplement se terminer et remettre ses ressources à son créateur.

On n'attend pas non plus silencieusement dans un coin sombre après une journée de travail, en attendant que quelqu'un se renverse l'épaule.

Sébastien Mach
la source
7
C'est une réponse idiote. Une partie d'un programme "faisant son travail" affiche les résultats de son travail à l'utilisateur. Il ne doit donc pas se terminer tant que l'utilisateur ne l'a pas notifié qu'il en a terminé. Un programme qui disparaît de l'écran de l'utilisateur une nanoseconde après avoir affiché ses résultats est inutile.
JBentley
1
@JBentley: J'ai parlé de la situation après avoir affiché les résultats, le cas échéant. Pour afficher les résultats, il existe des modèles appropriés, comme les signaux, les interruptions, les minuteries, le défilement dans votre terminal, les fichiers. system("pause")en soi n'affiche rien. Un programme d'interface de ligne de commande qui n'est pas invoqué depuis la ligne de commande et qui se ferme trop tôt est invoqué de manière incorrecte et avec les mauvaises options, et l'utilisation system("pause")pour contourner un programme invoqué à tort n'est vraiment pas la bonne chose à faire.
Sebastian Mach
1
Je veux dire, imaginez cat, less, vi, OpenOffice, Mathematica, GNU Octave, s'ils avaient utiliser system("pause")? Ce serait ennuyeux.
Sebastian Mach
2
Oui, ce serait ennuyeux, mais maintenant vous parlez spécifiquement des problèmes de system("pause"), alors que votre réponse parle "d'attendre avant de sortir", qui est un concept beaucoup plus généralisé. La plupart des exemples que vous avez donnés "attendent avant de quitter", jusqu'à ce que l'utilisateur informe le programme qu'il souhaite qu'il se termine. Je conviens que ce system("pause")n'est pas une bonne façon d'y parvenir et qu'il existe de meilleures solutions, mais ce n'est pas ce que dit votre réponse.
JBentley
1
@JBentley Oh, absolument: si un delay / wait / prompt fait partie de la sémantique du programme, pauseloin!
Courses de légèreté en orbite
3
system("pause");  

est faux car il fait partie de l'API Windows et ne fonctionnera donc pas dans d'autres systèmes d'exploitation.

Vous devriez essayer d'utiliser uniquement des objets de la bibliothèque standard C ++. Une meilleure solution sera d'écrire:

cin.get();
return 0;

Mais cela posera également des problèmes si vous avez d'autres cins dans votre code. Parce qu'après chaque cin, vous appuyez sur un Enterou \nqui est un caractère d'espace blanc. cinignore ce caractère et le laisse dans la zone tampon mais cin.get()obtient ce caractère resté. Ainsi, le contrôle du programme atteint la ligne return 0et la console se ferme avant de vous laisser voir les résultats.
Pour résoudre cela, nous écrivons le code comme suit:

cin.ignore();  
cin.get();  
return 0;
Sepideh Abadpour
la source
C'est légèrement trompeur. system()est standard et non spécifique à MS Windows. Cependant, la pausecommande shell est un héritage DOS et ne se trouve généralement que là-bas.
Ulrich Eckhardt le
1

Voici une raison pour laquelle vous ne devriez pas l'utiliser: cela va énerver la plupart des programmes antivirus exécutés sur Windows si vous passez le programme à une autre machine parce que c'est une menace pour la sécurité. Même si votre programme ne se compose que d'un simple, cout << "hello world\n"; system("pause"); il est lourd en ressources et le programme a accès à la commande cmd, que les antivirus considèrent comme une menace.

Andreas DM
la source
-1

les avantages de l'utilisation du système ("PAUSE"); tandis que la création des petites portions de votre programme est pour le déboguer vous-même. si vous l'utilisez pour obtenir les résultats des variables avant pendant et après chaque processus que vous utilisez pour vous assurer qu'elles fonctionnent correctement.

Après avoir testé et mis son plein potentiel avec le reste de la solution, vous devez supprimer ces lignes. il est vraiment utile de tester un algorithme défini par l'utilisateur et de garantir que vous faites les choses dans le bon ordre pour obtenir les résultats que vous souhaitez.

Vous ne souhaitez en aucun cas l'utiliser dans une application après l'avoir testé et assuré qu'il fonctionne correctement. Cependant, cela vous permet de suivre tout ce qui se passe au fur et à mesure. Ne l'utilisez pas du tout pour les applications des utilisateurs finaux.

Personne en particulier
la source
-3

Tout est question de style. C'est utile pour le débogage, mais sinon, il ne devrait pas être utilisé dans la version finale du programme. Cela n'a vraiment pas d'importance sur le problème de la mémoire parce que je suis sûr que les gars qui ont inventé le système ("pause") prévoyaient qu'il serait utilisé souvent. Dans une autre perspective, les ordinateurs sont de toute façon limités sur leur mémoire pour tout ce que nous utilisons sur l'ordinateur et cela ne pose pas de menace directe comme l'allocation de mémoire dynamique, donc je le recommande pour le débogage du code, mais rien d'autre.

Jason A.
la source
6
Cela n'a vraiment pas d'importance sur le problème de la mémoire parce que je suis sûr que les gars qui ont inventé le système ("pause") prévoyaient qu'il serait souvent utilisé n'a vraiment aucun sens. Personne pausen'a "inventé" ceci, n'a été conçu pour être utilisé dans les programmes batch DOS, il n'a jamais été prévu pour être utilisé d'une manière comme celle-ci. De plus, il y avait des alternatives bien meilleures avant que quiconque ne soit assez fou pour taper la phrase system("pause");.
dont