Bagaimana cara menghentikan aplikasi konsol C ++ agar segera keluar?

193

Akhir-akhir ini, saya mencoba mempelajari C ++ dari situs web ini . Sayangnya setiap kali saya mencoba menjalankan salah satu contoh kode, saya melihat program itu terbuka selama sekitar setengah detik dan kemudian segera ditutup. Apakah ada cara untuk menghentikan program dari penutupan segera sehingga saya dapat melihat buah dari usaha saya?

Adam P
sumber
5
Apakah Anda mengklik dua kali executable? Apakah Anda bekerja di Windows? Mengapa Anda tidak bekerja dari Command shell dan mengetik perintah seperti yang Anda inginkan dieksekusi?
S.Lott
8
@ S Lott: Karena jika Anda menekan tombol "Go" di IDE Anda, Anda tidak perlu repot dengan konsol.
Billy ONeal
4
Anda harus mempertimbangkan untuk mendapatkan buku yang bagus untuk belajar C ++. Situs web adalah sumber yang bagus, tetapi tidak cocok dengan teks pengantar yang baik. Ada daftar pasti buku-buku C ++ di sini: stackoverflow.com/questions/388242/…
James McNellis
6
@Billy Jika menekan tombol Go menutup aplikasi saat aplikasi berakhir, Anda menggunakan IDE yang salah.
2
Ditanyakan dan dijawab sebelumnya di sini: stackoverflow.com/questions/902261/… , meskipun yang ini memiliki judul yang lebih baik.
dmckee --- ex-moderator kitten

Jawaban:

121

Sunting: Seperti yang ditunjukkan Charles Bailey dengan benar di komentar di bawah, ini tidak akan berfungsi jika ada karakter yang di-buffered stdin, dan benar-benar tidak ada cara yang baik untuk mengatasinya. Jika Anda menjalankan dengan debugger terpasang, solusi yang disarankan John Dibling mungkin merupakan solusi terbersih untuk masalah Anda.

Yang mengatakan, saya akan meninggalkan ini di sini dan mungkin orang lain akan merasakan manfaatnya. Saya sering menggunakannya sebagai retasan cepat saat menulis tes selama pengembangan.


Di akhir mainfungsi Anda, Anda dapat meneleponstd::getchar();

Ini akan mendapatkan satu karakter dari stdin, sehingga memberi Anda semacam "tekan tombol apa saja untuk melanjutkan" perilaku (jika Anda benar-benar menginginkan pesan "tekan tombol apa saja", Anda harus mencetaknya sendiri).

Anda perlu #include <cstdio>untuk getchar.

James McNellis
sumber
15
getchartidak menyelesaikan masalah - atau hanya dalam keadaan terbatas, setidaknya. Bunyinya char dari stdin, tetapi jika sudah ada karakter buffered dari stdin program akan melanjutkan tanpa menunggu terlepas dari apakah Anda mencetak prompt atau tidak.
CB Bailey
1
@ Charles: Poin yang bagus. Mengabaikan hingga \nmerupakan solusi parsial, tetapi tidak akan membantu jika lebih dari satu baris input disangga. Saya tidak tahu cara C ++ standar untuk menghapus semuanya dari input stream. : - /
James McNellis
1
@ James: Tua, tapi bagaimana std::cin.ignore(std::cin.rdbuf()->in_avail());? Dapat dari sini .
GManNickG
1
Salah satu opsi yang saya gunakan banyak adalah std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');dengan #include <limits>.
Xeo
5
Tolong jangan lakukan ini. :( Ini bukan bagian dari fungsi program Anda untuk melakukan ini.
Lightness Races di Orbit
138

Jika Anda menggunakan Visual Studio dan Anda memulai aplikasi konsol dari IDE:

menekan CTRL-F5 (mulai tanpa debugging) akan memulai aplikasi dan membuka jendela konsol sampai Anda menekan tombol apa saja.

nabulke
sumber
1
Memulai konsol dari IDE? Bagaimana dan mengapa Anda melakukan itu?
CodyBugstein
1
Bagus sekali, itu berhasil. Mengapa ini bukan perilaku standar Visual Studio?
Luminer
Saya juga berpikir itu adalah cara untuk melakukannya, sampai hari ini, ketika saya membangun program konsol sederhana dan metode di atas tidak berhasil :(
KansaiRobot
1
Apakah ada versi ini dengan debugging?
luckyging3r
109

Solusi oleh James bekerja untuk semua Platform.

Atau WindowsAnda juga dapat menambahkan yang berikut sebelum kembali dari mainfungsi:

  system("pause");

Ini akan menjalankan pauseperintah yang menunggu hingga Anda menekan tombol dan juga menampilkan pesan yang bagusPress any key to continue . . .

codaddict
sumber
2
Itu terdengar seperti variasi solusi Rube Goldberg.
Dave Van den Eynde
4
@ Dave Van den Eynde: Ini juga cukup umum dan datang standar dalam kode boilerplate di DevCPP. +1
Billy ONeal
4
@Dave di sisi lain itu membuatnya jelas bahwa ini hanya sebuah bodge untuk contoh, sementara std: getch dapat secara tidak sengaja dibiarkan dalam kode nyata.
Martin Beckett
2
Ini adalah solusi yang sangat valid untuk mereka yang menggunakan Windows. Meskipun tidak ideal, ini berhasil
thecoshman
Solusi termudah, tercepat,. Hanya yang saya butuhkan
CodyBugstein
83

Jika Anda menggunakan Microsoft Visual C ++ 2010 Express dan mengalami masalah dengan CTRL + F5 tidak berfungsi untuk menjaga konsol tetap terbuka setelah program berakhir, lihat utas MSDN ini .

Kemungkinan IDE Anda diatur untuk menutup konsol setelah menjalankan CTRL + F5; bahkan, "Proyek Kosong" di Visual C ++ 2010 menutup konsol secara default. Untuk mengubah ini, lakukan seperti yang disarankan Moderator Microsoft:

Silakan klik kanan nama proyek Anda dan pergi ke halaman Properties, silakan buka Configuration Properties -> Linker -> System, silakan pilih Console (/ SUBSYSTEM: CONSOLE) di dropdown SubSystem. Karena, secara default, proyek Empty tidak menentukannya.

Tuan Underhill
sumber
1
Bagaimana jika itu bukan aplikasi konsol?
Jesse Pepper
3
@ Mr.Underhill Ini hanya akan berfungsi jika Anda memulai tanpa debugger (Ctrl + F5).
Jonathan Mee
Selain sebagai satu-satunya solusi non-hack, ini juga satu-satunya cara untuk melihat cetakan dari destruktor objek stack utama.
Poniros
20

Saya biasanya hanya meletakkan breakpoint pada main()kurung kurawal penutupan. Ketika akhir program tercapai dengan cara apa pun, breakpoint akan menekan dan Anda dapat ALT-Tab ke jendela konsol untuk melihat output.

John Dibling
sumber
14

Mengapa tidak menjalankan saja program dari konsol, mis. Jalankan program dari cmd.exe jika Anda menggunakan Windows. Dengan begitu jendela tetap terbuka setelah program selesai.

[EDIT]: Ketika saya menggunakan KDevelop4 ada contoh penuh Bash (Linux CLI) yang berjalan di tab di bagian bawah IDE. Itulah yang saya gunakan dalam situasi seperti ini.

Amos
sumber
3
Karena jika Anda menggunakan IDE, Anda biasanya tidak menggunakan konsol. Anda dorong pergi, program berjalan, dan hanya itu.
Billy ONeal
3
Setiap IDE yang kompeten akan menjaga konsol di layar ketika aplikasi berakhir - Code :: Blocks misalnya melakukan hal ini.
3
@nobugz: Saya menemukan jawabannya. Untuk mendapatkan jendela untuk bertahan, Anda harus memiliki / SUBSYSTEM: CONSOLE pada baris perintah linker. Dokumentasi mengatakan bahwa ini adalah default jika maindidefinisikan, tetapi jika saya tidak secara eksplisit mengaturnya pada baris perintah, VS membunuh jendela ketika aplikasi keluar. desah
James McNellis
2
@Ames: yang diperlukan untuk mendapatkan jendela konsol di tempat pertama. Itu pada gilirannya membutuhkan main () bukannya WinMain (), bukan sebaliknya. Saya agak tersesat ...
Hans Passant
4
@nobugz: Jika Anda memulai dari "Proyek Kosong" alih-alih "Aplikasi Konsol Win32" subsistem tidak secara eksplisit ditetapkan di properti proyek. Jika Anda mendefinisikan maindalam proyek, tautan secara default menggunakan subsistem CONSOLE. Saat debugging atau berjalan, Anda akan mendapatkan jendela konsol. Namun, kecuali Anda secara eksplisit menentukan CONSOLE sebagai subsistem dalam properti proyek, Visual Studio tidak akan membuat jendela konsol tetap terbuka. Saya selalu memulai dari proyek kosong dan saya jarang mengubah properti proyek individu, jadi saya belum pernah melihat jendela konsol tetap. Maaf atas kebingungan
James McNellis
9

Sebelum akhir kode Anda, masukkan baris ini:

system("pause");

Ini akan menjaga konsol sampai Anda menekan tombol.

#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
sumber
Itu juga dicetak "Tekan tombol apa saja untuk melanjutkan ..." untuk saya.
PapaHotelPapa
8

Telepon cin.get();2 kali:

    //...
    cin.get();
    cin.get();
    return 0
}
tsx
sumber
6
tapi kenapa dua kali ??
Madhawa Priyashantha
bagaimana jika kita membutuhkan cin.get () lain untuk mendapatkan contoh beberapa string di dalam array sebelum ini? Ini tidak berfungsi dalam skenario ini.
QMaster
4

Jika Anda menjalankan kode dari IDE yang kompeten, seperti Code :: Blocks , IDE akan mengelola konsol yang digunakannya untuk menjalankan kode tersebut, menjaganya tetap terbuka ketika aplikasi ditutup. Anda tidak ingin menambahkan kode khusus agar konsol tetap terbuka, karena ini akan mencegahnya berfungsi dengan benar ketika Anda menggunakannya secara nyata, di luar IDE.


sumber
3

Oke saya kira Anda menggunakan Windows di Visual Studio ... mengapa? Nah, karena jika Anda menggunakan sistem operasi Linux maka Anda mungkin akan menjalankannya dari konsol.

Bagaimanapun, Anda dapat menambahkan omong kosong ke akhir program Anda seperti yang disarankan orang lain, atau Anda bisa menekan CTRL + F5 (mulai tanpa debugging) dan Visual Studio akan meninggalkan konsol setelah selesai.

Opsi lain jika Anda ingin menjalankan versi Debug dan tidak menambahkan omong kosong ke kode Anda adalah membuka jendela konsol (Mulai -> Jalankan -> cmd) dan arahkan ke direktori keluaran Debug Anda . Kemudian, cukup masukkan nama executable Anda dan itu akan menjalankan program debug Anda di konsol. Anda kemudian dapat menggunakan lampiran Visual Studio untuk memproses atau sesuatu jika Anda benar-benar ingin.

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

using namespace std;

int main()
{

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

    return 0;
}

Saya tidak memperhatikan orang lain memposting ini jadi ini dia.

Ruan
sumber
Saya akan menambahkan bahwa itu conio.hadalah tajuk khusus Windows dan mungkin tidak tersedia di setiap mesin (atau Anda mungkin perlu menautkannya secara terpisah, yang merupakan pembunuhan berlebihan).
Yksisarvinen
Kerja. hanya perlu mengubah getch (); ke _getch (); sejak menjadi
usang
2

Jika Anda benar-benar men-debug aplikasi Anda di Visual C ++, tekan F5 atau segitiga hijau pada toolbar. Jika Anda tidak benar-benar men-debug itu (Anda tidak memiliki set breakpoints), tekan Ctrl + F5 atau pilih Mulai Tanpa Debug pada menu (biasanya pada menu Debug, yang saya setuju membingungkan.) Ini akan menjadi sedikit lebih cepat, dan yang lebih penting bagi Anda, akan berhenti pada akhirnya tanpa Anda harus mengubah kode Anda.

Atau, buka prompt perintah, navigasikan ke folder tempat exe Anda, dan jalankan dengan mengetik namanya. Dengan begitu ketika selesai menjalankan command prompt tidak menutup dan Anda dapat melihat hasilnya. Saya lebih suka kedua metode ini untuk menambahkan kode yang menghentikan aplikasi begitu selesai.

Kate Gregory
sumber
2

Cukup tambahkan berikut ini di akhir program Anda. Ini akan mencoba menangkap beberapa bentuk input pengguna sehingga menghentikan konsol dari menutup secara otomatis.

cin.get();
Bat_Programmer
sumber
2

Tambahkan baris berikut sebelum exit()fungsi apa pun atau sebelum apa pun returndi main():

std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");
Thomas Matthews
sumber
Ini tidak berfungsi untuk saya, baris pertama berfungsi tetapi menekan enter tidak melakukan apa pun
Qwertie
2

Untuk Visual Studio (dan hanya Visual Studio) potongan kode berikut memberi Anda prompt 'tunggu penekanan tombol untuk melanjutkan' yang benar-benar menunggu pengguna untuk menekan tombol baru secara eksplisit, dengan terlebih dahulu menyiram buffer input:

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

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

Perhatikan bahwa ini menggunakan tchar.hmakro agar kompatibel dengan beberapa 'set karakter' (sebagaimana VC ++ menyebutnya).

MicroVirus
sumber
2

Saya hanya melakukan ini:

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

Catatan: menghapus buffer cin dan itu hanya diperlukan jika Anda telah menggunakan cin di beberapa titik sebelumnya dalam program Anda. Juga menggunakan std :: numeric_limits :: max () mungkin lebih baik daripada INT_MAX, tapi agak bertele-tele dan biasanya tidak perlu.

GuestPerson00001
sumber
Berhasil, tetapi kembalinya 0; tidak akan dieksekusi jika saya menggunakan kode ini.
wernersbacher
2

Gunakan #include "stdafx.h"& system("pause");seperti kode di bawah ini.

#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
sumber
systemdinyatakan dalam <cstdlib>, bukan stdafx.h.
melpomene
1

Mirip dengan jawaban yeh , alternatifnya hanya minimalis.

Buat file batch dengan konten berikut:

helloworld.exe
pause

Kemudian gunakan file batch.

Cur
sumber
1

secara sederhana

#include <cstdio>

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

untuk beberapa alasan biasanya ada 1 karakter yang dapat dibaca dengan getchar yang sudah ada di stdin ketika Anda menjalankan suatu program. jadi getchar pertama membaca karakter ini, dan getchar kedua menunggu input pengguna (Anda) sebelum keluar dari program. Dan setelah suatu program keluar sebagian besar terminal, terutama pada terminal tutup Windows segera. jadi apa yang kami tuju adalah cara sederhana untuk mencegah suatu program selesai setelah menghasilkan segalanya. Tentu saja ada cara yang lebih kompleks dan bersih untuk menyelesaikan ini, tetapi ini adalah yang paling sederhana.

Dmitriy Suserov
sumber
2
Harap tambahkan setidaknya penjelasan singkat tentang mengapa ini menyelesaikan masalah.
kaya3
0

Lihat apakah IDE Anda memiliki kotak centang dalam pengaturan proyek untuk menjaga jendela tetap terbuka setelah program berakhir. Jika tidak, gunakan std::cin.get();untuk membaca karakter di akhir fungsi utama. Namun, pastikan untuk hanya menggunakan input berbasis baris (std :: getline) atau untuk menangani sisa karakter yang belum dibaca yang belum dibaca (std :: abaikan hingga baris baru) karena jika tidak .get () pada akhirnya hanya akan membaca sampah yang Anda tinggalkan belum dibaca sebelumnya.

Tronic
sumber
0

Ini tampaknya bekerja dengan baik:

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

Jika Anda menghapus buffer terlebih dahulu, itu tidak akan menjadi masalah ketika Anda membaca yang berikutnya. Untuk beberapa alasan cin.ignore(1)tidak berfungsi, itu harus 2.

Kode utara
sumber
1
2 kadang-kadang juga tidak cukup (ketika ada lebih banyak stroke kunci yang diantrekan). Cara yang benar adalah dengan mengabaikan karakter sebanyak yang ada dalam antrian. Untuk dengan cin.rdbuf()->in_avail,. Bukan angka ajaib seperti 1 atau 2.
Konrad Rudolph
0

Anda selalu bisa membuat file batch. Misalnya, jika program Anda disebut helloworld.exe, beberapa kode akan menjadi:

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

Jika Anda menjalankan Windows, maka Anda dapat melakukan system("pause >nul");atau system("pause");. Itu mengeksekusi perintah konsol untuk menghentikan sementara program sampai Anda menekan tombol. >nulmencegahnya mengatakan Press any key to continue....

PatThaCoder
sumber
0

Saya meletakkan breakpoint di 0 pengembalian terakhir program. Ini bekerja dengan baik.

lierosk
sumber
1
Ini tidak memberikan jawaban untuk pertanyaan itu. Untuk mengkritik atau meminta klarifikasi dari penulis, tinggalkan komentar di bawah posting mereka - Anda selalu dapat mengomentari posting Anda sendiri, dan setelah Anda memiliki reputasi yang cukup, Anda akan dapat mengomentari setiap posting .
Ravi Dhoriya ツ
1
Bagaimana ini tidak memberikan jawaban? Saya dalam situasi yang persis sama seperti penulis pertanyaan dan ini membantu.
lierosk
0

Saya menggunakan cin.get()dan itu berhasil tetapi suatu hari saya perlu menggunakan yang laincin.get([Array Variable]) sebelum itu untuk mengambil string ling dengan karakter kosong di tengah. jadi cin.get()jendela command prompt tidak terhindar dari penutupan. Akhirnya saya menemukan cara lain: Tekan CTRL + F5 untuk membuka di jendela eksternal dan Visual Studio tidak memiliki kontrol lagi. Hanya akan bertanya kepada Anda tentang penutupan setelah perintah terakhir dijalankan.

QMaster
sumber
0

Saya mencoba meletakkan getchar()fungsi di bagian akhir. Tapi itu tidak berhasil. Jadi yang saya lakukan adalah menambahkan dua getchar()fungsi satu demi satu. Saya pikir yang pertama getchar()menyerap Enterkunci yang Anda tekan setelah input data terakhir. Jadi cobalah menambahkan dua getchar()fungsi, bukan satu

Nathan Tuggy
sumber
0

Alih-alih menekan tombol run, tekan CTRL dan F5 secara bersamaan, itu akan memberi Anda tekan tombol apa saja untuk melanjutkan pesan. Atau ketik "(peringatan gunakan ini hanya untuk menguji bukan program yang sebenarnya sebagai antivirus tidak suka !!!!)" di akhir fungsi utama Anda tetapi: (peringatan gunakan ini hanya untuk menguji bukan program yang sebenarnya sebagai antivirus tidak suka !!!!)

anony
sumber
0

cukup gunakan cin.ignore () tepat sebelum kembali 0; dua kali

main()
  {
  //your codes 

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

  return 0;
  }

itu saja

Kursat Turkay
sumber
Saya biasanya melakukan ini sesuatu seperti ini. cin.ignore (); cin.get ();
aj.toulan
-1

Yang harus Anda lakukan adalah menetapkan variabel untuk x kemudian cukup ketik ini sebelum kembali 0;

cout<<"\nPress any key and hit enter to end...";
cin>>x;
Saran ramah
sumber
-1

Anda bahkan dapat mendeklarasikan integer di awal main()fungsi Anda (katakanlah int a;) dan letakkan std::cin >> a;sesaat sebelum nilai balik. Jadi program akan tetap berjalan sampai Anda menekan tombol dan masuk.

Izza
sumber