sistem ("jeda"); - Kenapa salah?


131

Inilah pertanyaan yang tidak saya mengerti:

Perintah, system("pause"); diajarkan kepada programmer baru sebagai cara untuk menjeda program dan menunggu input keyboard untuk melanjutkan. Namun, tampaknya disukai oleh banyak programmer veteran sebagai sesuatu yang tidak boleh dilakukan dalam berbagai tingkat.

Beberapa orang mengatakan itu baik untuk digunakan. Ada yang bilang itu hanya untuk digunakan ketika Anda terkunci di kamar Anda dan tidak ada yang menonton. Beberapa mengatakan bahwa mereka secara pribadi akan datang ke rumah Anda dan membunuh Anda jika Anda menggunakannya.

Saya sendiri adalah programmer baru tanpa pelatihan pemrograman formal. Saya menggunakannya karena saya diajarkan untuk menggunakannya. Yang tidak saya mengerti adalah bahwa jika itu bukan sesuatu untuk digunakan, lalu mengapa saya diajarkan untuk menggunakannya? Atau, di sisi lain, apakah sebenarnya tidak seburuk itu?

Apa pendapat Anda tentang hal ini?



5
Tampaknya orang menyukai panggilan mereka untuk benar-benar efisien. Dengan kata lain, "Cepat dan berhenti!"
Lee Louviere

63
Anda diajar karena umumnya guru adalah programmer yang buruk
yang

Silakan baca saran ini tentang mengajukan pertanyaan yang bagus: [ Cara Mengajukan Pertanyaan ], [Menulis pertanyaan yang sempurna ].
Adi Inbar

9
@wich sepenuhnya omong kosong.
Michael Chourdakis

Jawaban:


85

Itu disukai karena ini adalah peretasan platform-spesifik yang tidak ada hubungannya dengan benar-benar belajar pemrograman, tetapi sebaliknya untuk menyiasati fitur IDE / OS - jendela konsol diluncurkan dari Visual Studio ditutup ketika program telah selesai dieksekusi, dan sebagainya pengguna baru tidak dapat melihat output dari program barunya.

Bodging in System ("pause") menjalankan program "pause" command-line Windows dan menunggu untuk menghentikannya sebelum melanjutkan eksekusi program - jendela konsol tetap terbuka sehingga Anda dapat membaca output.

Ide yang lebih baik adalah meletakkan breakpoint di bagian akhir dan men-debug-nya, tetapi itu lagi-lagi memiliki masalah.


6
Visual Studio dapat menjalankan program dalam dua mode: dengan atau tanpa debugging. Ketika dijalankan dalam mode debugging, itu akan berhenti pada break point pertama. Jika Anda tidak memiliki satu yang ditentukan itu akan menjalankan program dan menutup konsol. Jadi, jika Anda ingin program konsol berhenti, cukup atur break-point, atau, lebih baik lagi, jalankan tanpa debugging! Itu akan menjalankan program dan menghentikan konsol.
Ivan Mesic

Ini bukan hanya fitur Visual Studio - jika Anda menjalankan program konsol dari Windows (yaitu sebagai lawan memuat command prompt dan menjalankannya dari sana), itu juga akan menutup ketika telah selesai dieksekusi.
JBentley

2
−1 Re "jendela konsol diluncurkan dari Visual Studio ditutup ketika program telah selesai dieksekusi", tidak, hanya untuk ketika program dijalankan di debugger. Re "menjalankan program command-line" pause "Windows, tidak ada seperti itu ( pauseada perintah internal cmd.exe). Daftar ide yang lebih baik juga sangat kurang.
Ceria dan hth. - Alf

Saya pikir jawaban ini adalah satu-satunya yang menyentuh pada aspek bahwa ini adalah solusi. Ia bekerja di sekitar perilaku lingkungan eksekusi spesifik yang menutup jendela terminal sebelum Anda dapat membaca output program. Yang harus Anda lakukan adalah memperbaiki lingkungan itu. Jika itu tidak dapat dilakukan, gunakan solusi ini, mungkin hanya jika IsDebuggerPresent()mengembalikan true dan dokumentasikan solusi ini dengan benar ("mengapa kode ini ada di sini?").
Ulrich Eckhardt

43

Itu lambat. Ini tergantung platform. Itu tidak aman.

Pertama: Apa fungsinya. Memanggil "sistem" secara harfiah seperti mengetikkan perintah ke command prompt windows. Ada satu ton pengaturan dan teardown untuk aplikasi Anda untuk melakukan panggilan seperti itu - dan overhead hanya konyol.

Bagaimana jika program yang disebut "jeda" ditempatkan di PATH pengguna? Hanya sistem panggilan ("jeda") hanya menjamin bahwa program yang disebut "jeda" dijalankan (harap Anda tidak memiliki executable Anda yang bernama "jeda"!)

Cukup tulis fungsi "Jeda ()" Anda sendiri yang menggunakan _getch. OK, tentu saja, _getch juga bergantung pada platform (catatan: ini didefinisikan dalam "conio.h") - tetapi jauh lebih bagus daripadasystem() jika Anda mengembangkan pada Windows dan memiliki efek yang sama (meskipun Anda bertanggung jawab untuk menyediakan teks dengan cout atau lebih).

Pada dasarnya: mengapa memperkenalkan begitu banyak masalah potensial ketika Anda bisa menambahkan dua baris kode dan satu termasuk dan mendapatkan mekanisme yang jauh lebih fleksibel?


61
Untuk seseorang yang mengeluh tentang ketergantungan platform, sepertinya aneh untuk menyarankan _getch, terutama ketika standar C ++ menyediakan getchar.
paxdiablo

33
saya merasakan ironi dalam menghitung overhead untuk interaksi dengan manusia)
ShPavel

1
@Spagpants: Mungkin Anda tidak mengerti perbedaan antara mendapatkan input dari manusia, dan menghasilkan gambar dan suara pada manusia.
yzt

1
@ Cheersandhth.-Alf - Hm? Ketika saya menulis ini, 8 tahun yang lalu, saya baru saja selesai men-debug masalah yang disebabkan oleh 'sistem ("jeda")' karena nama proyek yang dapat dieksekusi disebut "jeda" dan itu akan menjadi loop tak terhingga. Maksud saya masih berdiri, saya tidak yakin mengapa Anda mengatakan saya salah.

2
@paxdiablo getchar membutuhkan input dan kemudian menekan enter. _getch hanya memerlukan penekanan tombol apa pun kunci itu. Untuk meniru _getch di linux Anda memerlukan 5-6 baris kode untuk mengubah mode konsol, dan kemudian mengubahnya kembali ke default. Itu tidak sama, ia melakukan hal yang berbeda. getchar bukan pengganti _getch.
Barnack

29
  • lambat: ia harus melewati banyak kode Windows yang tidak perlu dan program terpisah untuk operasi sederhana
  • tidak portabel: tergantung pada program jeda
  • bukan gaya yang baik: membuat panggilan Sistem hanya boleh dilakukan ketika benar - benar diperlukan
  • lebih banyak mengetik: Sistem ("jeda") lebih panjang dari getchar ()

getchar sederhana () harusnya baik-baik saja.


26

Menggunakan system("pause");adalah Ungood Practice ™ karena

  • Sama sekali tidak perlu .
    Untuk menjaga program jendela konsol terbuka di akhir ketika Anda menjalankannya dari Visual Studio, gunakan Ctrl+ F5untuk menjalankannya tanpa debugging, atau tempat lain breakpoint pada penjepit yang tepat terakhir }dari main. Jadi, tidak ada masalah di Visual Studio. Dan tentu saja tidak ada masalah sama sekali ketika Anda menjalankannya dari baris perintah.

  • Ini bermasalah & menjengkelkan
    ketika Anda menjalankan program dari baris perintah. Untuk eksekusi interaktif Anda harus menekan tombol di bagian akhir tanpa tujuan apa pun. Dan untuk digunakan dalam otomatisasi beberapa tugas yang pausesangat tidak diinginkan!

  • Ini tidak portabel.
    Unix-land tidak memiliki pauseperintah standar .

The pauseperintah internal cmd.execommand dan tidak dapat ditimpa, seperti yang keliru diklaim dalam setidaknya satu jawaban lainnya. Yaitu itu bukan risiko keamanan, dan klaim bahwa program AV mendiagnosisnya sama meragukannya dengan klaim mengesampingkan perintah (setelah semua, program C ++ memohonsystem berada dalam posisi untuk melakukan sendiri semua yang dapat dilakukan penerjemah perintah, dan lebih). Selain itu, sementara cara berhenti ini sangat tidak efisien oleh standar pemrograman C ++ biasa, itu tidak masalah sama sekali pada akhir program pemula.

Jadi, klaim dalam gerombolan jawaban sebelum ini tidak benar, dan alasan utama Anda tidak boleh menggunakan system("pause") atau perintah tunggu lain di akhir Anda main, adalah poin pertama di atas: sama sekali tidak perlu, sama sekali tidak ada gunanya , itu sangat konyol.


1
Terkadang Ungood Practice ™ diperlukan untuk tes cepat .... apa yang kita sebut "cepat dan kotor"
Michael Haephrati

22

Singkatnya, itu harus menghentikan sementara pelaksanaan program dan membuat panggilan sistem dan mengalokasikan sumber daya yang tidak perlu ketika Anda bisa menggunakan sesuatu yang sederhana seperti cin.get (). Orang-orang menggunakan System ("PAUSE") karena mereka ingin program menunggu sampai mereka menekan enter agar mereka dapat melihat output mereka. Jika Anda ingin sebuah program menunggu input, ada fungsi bawaan untuk itu yang juga lintas platform dan kurang menuntut.

Penjelasan lebih lanjut dalam artikel ini .


Wow, kamu lagi! kamu tinggal disini? lol Bagaimanapun, terima kasih, saya akan membaca. Sementara itu, bagaimana pendapat ANDA tentang hal ini?
Faken

Saya memiliki pertanyaan yang sama ketika pertama kali memulai C beberapa tahun yang lalu, dan saya diarahkan ke artikel yang sama. Saya menggunakan getchar () secara pribadi.
John T

Ho wow ... Saya belum melakukan C ++ untuk sementara waktu tapi ya .. ada cara yang pasti lebih baik untuk mencapai hasil yang sama
Newtopian

16

Anda dapat menggunakan std::cin.get()dari 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;
}

Selain itu, system('pause')lambat, dan termasuk file Anda mungkin tidak perlu: stdlib.h. Ini tergantung pada platform, dan sebenarnya memanggil OS 'virtual'.


3
Saya diajarkan untuk menggunakan System("pause")kursus pemrograman tahun pertama, tetapi saya ingin dapat menjalankan program saya di Mac, jadi saya harus belajar cin.get().
daviewales

10

Karena tidak portabel.

pause

adalah program windows / dos saja, jadi ini kode Anda tidak akan berjalan di linux. Selain itu, systemumumnya tidak dianggap sebagai cara yang sangat baik untuk memanggil program lain - biasanya lebih baik untuk digunakan CreateProcessatau forkatau yang serupa.


4

Seperti yang tercantum pada jawaban lain, ada banyak alasan yang dapat Anda temukan untuk menghindari hal ini. Semuanya bermuara pada satu alasan yang membuat sisanya diperdebatkan. The System()Fungsi secara inheren tidak aman / tidak dipercaya, dan tidak diperkenalkan ke dalam program kecuali jika diperlukan.

Untuk tugas siswa, kondisi ini tidak pernah dipenuhi, dan untuk alasan ini saya akan gagal tugas bahkan tanpa menjalankan program jika panggilan ke metode ini hadir. (Ini diperjelas dari awal.)


4

Bagi saya itu tidak masuk akal untuk menunggu sebelum keluar tanpa alasan. Suatu program yang telah melakukan tugasnya harus mengakhiri dan menyerahkan sumber dayanya kembali kepada penciptanya.

Seseorang juga tidak diam-diam menunggu di sudut gelap setelah hari kerja, menunggu seseorang memiringkan bahu.


7
Ini jawaban yang konyol. Bagian dari program "melakukan tugasnya" adalah menampilkan hasil pekerjaannya kepada pengguna. Karena itu seharusnya tidak berakhir sampai pengguna memberi tahu bahwa mereka selesai dengan itu. Sebuah program yang menghilang dari layar pengguna satu nanodetik setelah ia menampilkan hasilnya, tidak berguna.
JBentley

1
@JBentley: Saya berbicara tentang situasi setelah menampilkan hasilnya, jika ada. Untuk menampilkan hasil, ada pola yang sesuai, seperti sinyal, interupsi, timer, scrollback di terminal Anda, file. system("pause")dengan sendirinya tidak menampilkan apa pun. Program antarmuka baris perintah yang dipanggil bukan dari baris perintah dan ditutup terlalu dini dipanggil dengan salah dan dengan opsi yang salah, dan menggunakan system("pause")untuk menghindari program yang dipanggil salah sebenarnya bukan hal yang benar untuk dilakukan.
Sebastian Mach

1
Maksud saya, bayangkan saja cat, less, vi, OpenOffice, Mathematica, GNU Octave, bagaimana jika mereka akan menggunakan system("pause")? Itu akan mengganggu.
Sebastian Mach

2
Ya, itu akan mengganggu, tetapi sekarang Anda secara khusus berbicara tentang masalah system("pause"), sedangkan jawaban Anda berbicara tentang "tunggu sebelum keluar", yang merupakan konsep yang jauh lebih umum. Banyak contoh yang Anda berikan ternyata "tunggu sebelum keluar", sampai pengguna memberi tahu program bahwa mereka ingin keluar. Saya setuju bahwa system("pause")itu bukan cara yang baik untuk mencapai itu dan bahwa ada solusi yang lebih baik, tetapi bukan itu jawaban Anda.
JBentley

1
@JBentley Oh, tentu saja: jika penundaan / tunggu / prompt adalah bagian dari semantik program, pausepergi!
Lightness Races in Orbit

3
system("pause");  

salah karena itu adalah bagian dari Windows API dan karena itu tidak akan berfungsi di sistem operasi lain.

Anda harus mencoba menggunakan hanya objek dari pustaka standar C ++. Solusi yang lebih baik adalah menulis:

cin.get();
return 0;

Tetapi itu juga akan menyebabkan masalah jika Anda memiliki cinkode lain di dalam kode Anda. Karena setelah masing-masing cin, Anda akan mengetuk Enteratau \nyang merupakan karakter spasi putih. cinabaikan karakter ini dan tinggalkan di buffer zone tetapi cin.get(), dapatkan karakter ini tetap. Jadi kontrol program mencapai garis return 0dan konsol ditutup sebelum membiarkan Anda melihat hasilnya.
Untuk mengatasi ini, kami menulis kode sebagai berikut:

cin.ignore();  
cin.get();  
return 0;

Itu sedikit menyesatkan. system()adalah standar dan tidak spesifik untuk MS Windows. Namun, pauseperintah shell adalah warisan DOS dan biasanya hanya ditemukan di sana.
Ulrich Eckhardt

1

Inilah salah satu alasan Anda tidak boleh menggunakannya: itu akan membuat marah sebagian besar program anti-virus yang berjalan pada Windows jika Anda meneruskan program ke komputer lain karena itu merupakan ancaman keamanan. Bahkan jika program Anda hanya terdiri dari cout << "hello world\n"; system("pause"); sumber daya yang sederhana dan program ini mendapatkan akses ke perintah cmd, yang dilihat oleh anti virus sebagai ancaman.


-1

pro untuk menggunakan sistem ("PAUSE"); sementara membuat sebagian kecil dari program Anda adalah untuk debugging sendiri. jika Anda menggunakannya untuk mendapatkan hasil variabel sebelum selama dan setelah setiap proses yang Anda gunakan untuk memastikan bahwa mereka berfungsi dengan baik.

Setelah menguji dan memindahkannya ke ayunan penuh dengan sisa solusi Anda harus menghapus garis-garis ini. itu sangat bagus ketika menguji algoritma yang ditentukan pengguna dan memastikan bahwa Anda melakukan hal-hal dalam urutan yang tepat untuk hasil yang Anda inginkan.

Tidak berarti apakah Anda ingin menggunakan ini dalam aplikasi setelah Anda mengujinya dan memastikan bahwa itu berfungsi dengan baik. Namun itu memungkinkan Anda untuk melacak semua yang terjadi saat itu terjadi. Jangan menggunakannya untuk aplikasi Pengguna Akhir sama sekali.


-3

Ini semua masalah gaya. Ini berguna untuk debugging tetapi selain itu tidak boleh digunakan dalam versi final program. Benar-benar tidak masalah pada masalah memori karena saya yakin orang-orang yang menemukan sistem ("jeda") mengantisipasi bahwa itu akan sering digunakan. Dalam perspektif lain, komputer menjadi terhambat pada memori mereka untuk semua hal lain yang kita gunakan di komputer dan itu tidak menimbulkan ancaman langsung seperti alokasi memori dinamis, jadi saya akan merekomendasikannya untuk kode debugging, tetapi tidak ada yang lain.


6
Ini benar-benar tidak masalah pada masalah memori karena saya yakin orang-orang yang menemukan sistem ("jeda") mengantisipasi bahwa itu akan digunakan sering benar-benar tidak masuk akal sama sekali. Tidak ada yang "menemukan" ini, pausedirancang untuk digunakan dalam program batch DOS, tidak pernah dimaksudkan untuk digunakan dengan cara seperti ini. Selain itu ada alternatif yang jauh lebih baik sebelum ada orang yang cukup gila untuk mengetik frasa system("pause");.
yang
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.