Mencegah jendela konsol dari penutupan pada aplikasi Visual Studio C / C ++ Konsol

464

Ini mungkin pertanyaan yang memalukan karena tidak diragukan lagi jawabannya sangat jelas.

Saya telah menggunakan Visual Studio selama bertahun-tahun, tetapi ini adalah pertama kalinya saya melakukan pengembangan 'Aplikasi Konsol'.

Ketika saya menjalankan aplikasi saya jendela konsol muncul, output program muncul dan kemudian jendela ditutup ketika aplikasi keluar.

Apakah ada cara untuk tetap membuka sampai saya memeriksa output, atau melihat hasilnya setelah jendela ditutup?

Martin
sumber
Monodevelop melakukan apa yang Anda harapkan.
ctrl-alt-delor
3
Ada terlalu banyak jawaban di bawah ini jadi saya salin jawaban di sini: jika Anda menggunakan VS2017, maka Tools-> Options-> Debugging-> Secara otomatis menutup konsol
jw_
Sepakat. Saya pikir jawaban terbaik untuk VS 2017 dan yang lebih baru adalah jawaban chronoxor.
All the Rage

Jawaban:

466

Jika Anda menjalankan tanpa debugging (Ctrl + F5) maka secara default meminta Anda untuk menekan kembali untuk menutup jendela. Jika Anda ingin menggunakan debugger, Anda harus meletakkan breakpoint pada baris terakhir.

Tom
sumber
268
Jika Anda memiliki aplikasi C ++ dan Jalankan Tanpa Debugging dan jendela konsol masih ditutup, Anda harus ingat untuk secara eksplisit mengatur Subsystem ke Konsol di bawah Configuration Properties / Linker / System. Ini bisa terjadi jika Anda memulai dengan Proyek Kosong, yang membuat Subsystem tidak disetel.
Trevor Robinson
4
Tidak bekerja untuk saya :( Jendela konsol terbuka dan langsung tutup, tetapi log berhenti dan menunggu pers tambahan F5
CodyBugstein
40
Jawaban yang benar adalah yang oleh @TrevorRobinson: Ini adalah versi yang diperluas jika Anda mengalami kesulitan mencari tahu di mana properti konfigurasi: Klik kanan pada proyek Anda di Visual Studio> Properti> Properti Konfigurasi> Linker> Sistem, ubah Subsistem ke " Konsol "
PlagueHammer
3
Trevor Robinson benar. Jika Anda memulai proyek kosong, dan item C ++. Anda harus pergi ke View-> Manajer Properti-> Properti (ikon kunci inggris) -> Konfigurasi. Properties-> Linker-> System-> Subsystem-> di menu pop-down, pilih Console.
Yang Mulia,
10
Saya bekerja pada komunitas VS 2017. ctrl+f5tidak berfungsi, tidak ada Propertiesketika saya mengklik kanan proyek, juga wrench icondiklik.
Ketan
232

Klik kanan pada proyek Anda

Properti> Properti Konfigurasi> Linker> Sistem

Pilih Konsol (/ SUBSYSTEM: CONSOLE) di SubSystemopsi atau Anda bisa langsung mengetik Konsol di bidang teks!

Sekarang coba ... itu harus bekerja

Viraj
sumber
Ini bekerja untuk VS2013 Express saya, tetapi jawaban yang diterima tidak. Sangat aneh, karena jawaban yang diterima telah berfungsi untuk semua versi Visual Studio yang pernah saya gunakan sebelumnya.
Michael Calvin
9
@MichaelCalvin Anda harus menjalankan dengan Ctrl + F5 setelah mengatur ini, itulah kicker.
Jonathan Mee
sebagai @ JonathanMee menyatakan Anda masih menjalankan Ctrl + F5. Ini sudah diatur di studio visual saya 2015, jadi jawaban pertama adalah yang paling membantu.
Ini memang benar. Familiar CTRL+F5akan gagal jika Anda, katakanlah, menambahkan file C ++ baru ke proyek kosong.
user2023370
Bekerja untuk saya di Visual Studio Express 2015. Terima kasih.
LHC
44

Berikut ini cara untuk C / C ++:

#include <stdlib.h>

#ifdef _WIN32
    #define WINPAUSE system("pause")
#endif

Letakkan ini di bagian atas program Anda, dan JIKA ada di sistem Windows ( #ifdef _WIN32), maka itu akan membuat makro yang disebut WINPAUSE. Setiap kali Anda ingin program Anda berhenti, panggilan WINPAUSE;dan itu akan menghentikan program, menggunakan perintah DOS. Untuk sistem lain seperti Unix / Linux, konsol seharusnya tidak berhenti saat keluar dari program.

Shaun
sumber
Metode ini tidak berfungsi dalam Visual C ++ (kecuali Anda menyertakan beberapa header?)
wmac
2
@wmac Anda harus menyertakan header windows.h
Geowil
1
Saya tidak menyertakan pustaka atau ruang nama apa pun tetapi berjalan dengan benar, terima kasih banyak.
Halil İbrahim Oymacı
1
Tolong jangan lakukan itu. The pauseperintah Windows-spesifik.
firegurafiku
Bekerja untuk saya di Visual Studio 2013 Express. :)
Anirban
32

Goto Debug Menu-> Tekan StartWithoutDebugging

pashaplus
sumber
Ini bahkan bukan opsi di VS 2008 kecuali C # Development Environment dipilih. CTRL + F5 berfungsi. Anda juga dapat menambahkan ini sebagai tombol ke bilah alat melalui Alat> Kustomisasi.
perry
Jika Anda memiliki banyak proyek, tetapkan proyek yang relevan sebagai proyek startup
CAD bloke
27

Jika Anda menggunakan .NET, letakkan Console.ReadLine()sebelum akhir program.

Itu akan menunggu <ENTER>.

Cheeso
sumber
9
+1 - Entah itu atau Console.ReadKey()hanya menunggu kunci apa saja.
Fredrik Mörk
Aneh, ini tidak berpengaruh pada aplikasi saya. Itu masih ditutup tanpa menunggu input pengguna.
Kokodoko
4
Kemudian kode Anda kemungkinan besar keluar sebelum mencapai titik itu.
Memang
20

Mulai dari Visual Studio 2017 (15.9.4) ada opsi:

Tools->Options->Debugging->Automatically close the console

Fragmen yang sesuai dari dokumentasi Visual Studio :

Secara otomatis menutup konsol ketika debugging berhenti:

Memberitahu Visual Studio untuk menutup konsol pada akhir sesi debugging.

chronoxor
sumber
2
Saya baru saja menguji ini di VS2017 dan VS2019. Dibutuhkan pengaturan subsistem ke CONSOLE dan mematikan opsi ini. Memiliki satu atau yang lain atau tidak menutup jendela secara otomatis.
Casey
Ini masih menutup jendela bagi saya jika saya meluncurkan beberapa proyek dari solusi yang sama.
Serge Rogatch
Saya merasa ini adalah jawaban yang tepat untuk VS 2017 dan seterusnya. Sayang sekali tidak ada dalam versi yang lebih lama.
All the Rage
13

coba panggil getchar()tepat sebelum main()kembali.

Magarusu
sumber
Tidak bekerja di VS 2008 untuk aplikasi konsol Hello Name yang sederhana. cout, cin, cout, getchar (), konsol masih ditutup. Apa masalahnya?
perry
1
Coba letakkan getchar () dua kali jika Anda memiliki cout sebelum getchar (). getchar () mengharapkan char dan Anda sudah memberikannya dengan cout ... Beri tahu saya jika ini membantu :)
Magarusu
12

(/ SUBSYSTEM: CONSOLE) tidak berfungsi untuk vs2013 saya (saya sudah memilikinya).

"jalankan tanpa debugging" bukanlah suatu opsi, karena saya tidak ingin beralih antara debugging dan melihat output.

Saya berakhir dengan

int main() {
  ...
#if _DEBUG
  LOG_INFO("end, press key to close");
  getchar();
#endif // _DEBUG
  return 0;
}

Solusi yang digunakan dalam qtcreator pra 2.6. Sekarang sementara qt sedang berkembang, vs sedang menuju ke arah lain. Seingat saya, di VS2008 kita tidak perlu trik seperti itu.

fantastory
sumber
7

Berikut adalah solusi yang (1) tidak memerlukan perubahan kode atau breakpoint, dan (2) berhenti setelah penghentian program sehingga Anda dapat melihat semua yang dicetak. Ini akan berhenti setelah F5 atau Ctrl + F5. Kelemahan utama adalah bahwa pada VS2013 Express (seperti yang diuji), ia tidak memuat simbol, sehingga debugging sangat dibatasi.

  1. Buat file batch. Saya menelepon milik saya runthenpause.bat, dengan isi sebagai berikut:

    %1 %2 %3 %4 %5 %6 %7 %8 %9
    pause

    Baris pertama akan menjalankan perintah apa pun yang Anda berikan dan hingga delapan argumen. Baris kedua akan ... berhenti sebentar.

  2. Buka properti proyek | Properti konfigurasi | Debugging.

  3. Ubah "Argumen Perintah" menjadi $(TargetPath)(atau apa pun yang ada di "Perintah").
  4. Ubah "Command" menjadi path lengkap ke runthenpause.bat.
  5. Tekan OK.

Sekarang, ketika Anda menjalankan, runthenpause.batakan meluncurkan aplikasi Anda, dan setelah aplikasi Anda dihentikan, Anda akan berhenti untuk melihat output konsol.

Saya akan memposting pembaruan jika saya tahu cara mendapatkan simbol dimuat. Saya mencoba /Z7per ini tetapi tidak berhasil.

cxw
sumber
1
Ini masih tidak mendukung debugging, tetapi setidaknya ini mengatasi masalah tidak dapat melihat output misalnya VLD, berbeda dengan semua jawaban lainnya.
Martin Hennings
6

cukup cantumkan baris kode terakhir Anda:

system("pause");
RefaelJan
sumber
3

Anda bisa menjalankan executable Anda dari prompt perintah. Dengan cara ini Anda bisa melihat semua output. Atau, Anda dapat melakukan sesuatu seperti ini:

int a = 0;
scanf("%d",&a);

return YOUR_MAIN_CODE;

dan dengan cara ini jendela tidak akan menutup sampai Anda memasukkan data untuk avariabel.

Geo
sumber
3

tambahkan "| jeda ”di kotak argumen perintah di bawah bagian debugging di properti proyek.

theambient
sumber
4
Ini akan menjadi solusi yang bagus jika berhasil. pausetampaknya hanya berfungsi dalam file batch, dan saat menerima input dari program Anda di STDIN, itu tidak mencetak ulang teks itu. Saya mencoba mengganti |dengan &&, tetapi tidak berpengaruh - mungkin karena tidak dijalankan dengan shell perintah (cmd.exe).
Brian Vandenberg
3

Cukup tekan CNTRL + F5 untuk membukanya di jendela baris perintah eksternal (Visual Studio tidak memiliki kendali atasnya).

Jika ini tidak berhasil maka tambahkan berikut ini di akhir kode Anda:

Console.WriteLine("Press any key to exit...");
Console.ReadKey();

Ini menunggu Anda untuk menekan tombol untuk menutup jendela terminal setelah kode mencapai akhir.

Jika Anda ingin melakukan ini di banyak tempat, masukkan kode di atas dalam suatu metode (mis. private void Pause()) Dan panggil Pause()setiap kali suatu program mencapai kemungkinan akhir.

hati-hati1
sumber
ketika saya melakukan cntrl + f5 membuka kemudian menutup segera? bagaimana Anda memperbaikinya?
Callat
Solusi kedua adalah apa yang saya cari!
RoG
Ketika saya menekan Ctrl + F5, tidak ada yang terjadi. Dulu bekerja untuk saya tetapi tiba-tiba, itu berhenti bekerja.
Natasha
2

Solusi yang agak lebih baik:

atexit([] { system("PAUSE"); });

di awal program Anda.

Pro:

  • dapat menggunakan std :: exit ()
  • dapat memiliki beberapa pengembalian dari main
  • Anda dapat menjalankan program Anda di bawah debugger
  • IDE independen (+ OS independen jika Anda menggunakan cin.sync(); cin.ignore();trik alih-alih system("pause");)

Cons:

  • harus memodifikasi kode
  • tidak akan berhenti pada std :: terminate ()
  • masih akan terjadi di program Anda di luar sesi IDE / debugger; Anda dapat mencegah ini di bawah Windows menggunakan:

extern "C" int __stdcall IsDebuggerPresent(void);
int main(int argc, char** argv) {
    if (IsDebuggerPresent())
        atexit([] {system("PAUSE"); });
    ...
}
GhassanPL
sumber
Saran yang sangat buruk.
Ceria dan hth. - Alf
Bisakah Anda menjelaskan mengapa?
GhassanPL
Dalam kasus di mana seseorang tidak melakukan debug tidak ada gunanya, karena dalam kasus ini tidak ada masalah yang harus dipecahkan. Dalam VS jalankan saja programnya dengan Ctrl + F5 dan hanya itu, jadi tidak ada masalah di VS, dan dalam interpreter perintah tidak ada masalah, singkatnya, tidak ada masalah. Dan dalam kasus di mana seseorang melakukan debug dan ingin berhenti menambahkan kode untuk berhenti bukanlah solusi yang lebih nyaman daripada breakpoint, dan mengganggu dalam situasi di mana orang tidak ingin berhenti.
Ceria dan hth. - Alf
2

Baik digunakan:

  1. cin.get();

atau

  1. system("pause");

Pastikan untuk membuat keduanya di akhir main()fungsi dan sebelum returnpernyataan.

AAEM
sumber
2

Anda juga dapat menggunakan opsi ini

#include <conio.h> 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main() {
   .
   .
   .
   getch(); 

   return 0;
}
Vladimir Salguero
sumber
2

Dalam kasus saya, saya mengalami ini ketika saya membuat proyek Empty C ++ pada edisi komunitas VS 2017. Anda perlu mengatur Subsistem ke "Konsol (/ SUBSYSTEM: CONSOLE)" di bawah Configuration Properties.

  1. Buka "Lihat" lalu pilih "Manajer Properti"
  2. Klik kanan pada proyek / solusi dan pilih "Properti". Ini membuka halaman properti Uji
  3. Arahkan ke linker lalu pilih "Sistem"
  4. Klik pada "SubSystem" dan sebuah drop down muncul
  5. Pilih "Konsol (/ SUBSYSTEM: CONSOLE)"
  6. Terapkan dan simpan
  7. Lain kali Anda menjalankan kode Anda dengan "CTRL + F5", Anda akan melihat hasilnya.
Stephen Haruna
sumber
0

Visual Studio 2015 , dengan impor . Karena saya benci ketika contoh kode tidak memberikan impor yang dibutuhkan.

#include <iostream>;

int main()
{
    getchar();
    return 0;
}
JMI MADISON
sumber