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?
Réponses:
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.
la source
pause
est une commande interne danscmd.exe
). La liste des meilleures idées fait également cruellement défaut.IsDebuggerPresent()
renvoie true et documentez correctement cette solution de contournement («pourquoi ce code est-il ici?»).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?
la source
_getch
, surtout lorsque le C ++ standard le fournitgetchar
.un simple getchar () devrait faire l'affaire.
la source
Utiliser
system("pause");
is Ungood Practice ™ parce queC'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
}
demain
. 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
pause
sont très indésirables!Ce n'est pas portable.
Unix-land n'a pas de
pause
commande standard .La
pause
commande est unecmd.exe
commande 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 ++ invoquantsystem
est 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 votremain
, est le premier point ci-dessus: c'est complètement inutile, cela ne sert absolument à rien , c'est juste très idiot.la source
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.
la source
Vous pouvez utiliser à
std::cin.get()
partir deiostream
: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».la source
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 davantagecin.get()
.Parce qu'il n'est pas portable.
est un programme Windows / DOS uniquement, donc votre code ne fonctionnera pas sous Linux. De plus, ce
system
n'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'utiliserCreateProcess
oufork
ou quelque chose de similaire.la source
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.)
la source
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.
la source
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'utilisationsystem("pause")
pour contourner un programme invoqué à tort n'est vraiment pas la bonne chose à faire.cat
,less
,vi
,OpenOffice
,Mathematica
,GNU Octave
, s'ils avaient utilisersystem("pause")
? Ce serait ennuyeux.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 cesystem("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.pause
loin!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:
Mais cela posera également des problèmes si vous avez d'autres
cin
s dans votre code. Parce qu'après chaquecin
, vous appuyez sur unEnter
ou\n
qui est un caractère d'espace blanc.cin
ignore ce caractère et le laisse dans la zone tampon maiscin.get()
obtient ce caractère resté. Ainsi, le contrôle du programme atteint la lignereturn 0
et la console se ferme avant de vous laisser voir les résultats.Pour résoudre cela, nous écrivons le code comme suit:
la source
system()
est standard et non spécifique à MS Windows. Cependant, lapause
commande shell est un héritage DOS et ne se trouve généralement que là-bas.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.la source
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.
la source
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.
la source
pause
n'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 phrasesystem("pause");
.