Bagaimana agar jendela konsol tetap terbuka di Visual C ++?

191

Saya memulai dengan Visual C ++ dan saya ingin tahu bagaimana cara menjaga jendela konsol.

Misalnya ini adalah aplikasi "hello world" yang khas:

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    return 0;
}

Apa garis yang saya lewatkan?

Raúl Roa
sumber
Amruth A. Pillai kode Anda tidak menunjukkan "tekan sembarang tombol untuk melanjutkan" terima kasih
Anda dapat mencetaknya sendiri dengan std :: cout call sederhana.
Raúl Roa
5
Kelemahan dari semua solusi yang diusulkan adalah tidak satupun dari mereka yang bekerja dengan debugging (Ctrl + F5 gagal di sini) dan ketika aplikasi berhenti secara tak terduga (semua breakpoint atau membaca dari stdin saat pengembalian utama gagal di sini). Yang ingin saya lihat adalah jendela konsol di-IDE seperti Eclipse dan yang dimiliki oleh IDE lainnya. Mereka tetap menunjukkan output ke stdout / stderr setelah program berakhir.
dr. Sybren
@ sybren Jawaban yang diterima bekerja dengan CTRL + F5, dan mengapa Anda menginginkan solusi yang bekerja dengan debugging (F5)? Tentunya inti dari debugging adalah untuk .. debug? Apa manfaat memiliki konsol yang dijeda setelah penghentian program, dalam sesi debugging?
JBentley
2
@JBentley Eclipse dan IDE lain memungkinkan Anda membaca output program Anda bahkan setelah proses dihentikan. Tentunya Anda melihat manfaat tambahan, terutama ketika mencoba menemukan bug? Breakpoint juga hanya berfungsi ketika Anda tahu di mana program ini berhenti, yang mungkin sulit untuk mengetahui kapan output menghilang dari layar Anda.
dr. Sybren

Jawaban:

389

Mulai proyek dengan Ctrl+F5alih - alih adil F5.

Jendela konsol sekarang akan tetap terbuka dengan Press any key to continue . . .pesan setelah program keluar.

Perhatikan bahwa ini memerlukan Console (/SUBSYSTEM:CONSOLE)opsi tautan , yang dapat Anda aktifkan sebagai berikut:

  1. Buka proyek Anda, dan pergi ke Solution Explorer. Jika Anda mengikuti saya di K&R, "Solusi" Anda akan menjadi 'halo' dengan 1 proyek di bawahnya, juga 'halo' dengan huruf tebal.
  2. Klik kanan pada 'halo "(atau apa pun nama proyek Anda.)
  3. Pilih "Properti" dari menu konteks.
  4. Pilih Properti Konfigurasi> Linker> Sistem.
  5. Untuk properti "Subsistem" di panel sebelah kanan, klik kotak drop-down di kolom sebelah kanan.
  6. Pilih "Konsol (/ SUBSYSTEM: CONSOLE)"
  7. Klik Terapkan, tunggu hingga selesai melakukan apa pun yang dilakukannya, lalu klik OK. (Jika "Terapkan" berwarna abu-abu, pilih beberapa opsi subsistem lainnya, klik Terapkan, lalu kembali dan terapkan opsi konsol. Pengalaman saya adalah bahwa OK itu sendiri tidak akan berfungsi.)

CTRL-F5 dan petunjuk subsistem bekerja bersama; mereka bukan opsi yang terpisah.

(Atas perkenan DJMorreTX dari http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6 )

Zoidberg
sumber
36
Ini menjalankan program tanpa debugging; lebih baik memiliki solusi yang berfungsi baik dalam mode debug dan run biasa.
ス ー パ ー フ ァ ミ コ ン
3
Bagi siapa pun yang tidak bisa mendapatkan solusi ini untuk bekerja di proyek makefile, ini disebabkan oleh bug di Visual Studio. Saya baru saja memposting jawaban dengan perbaikannya.
JBentley
1
Dapat mengkonfirmasi! Punya aplikasi konsol yang tidak berhasil melakukan ini dan itu berhasil. Anda tidak perlu mengubah kode Anda dengan cin.get(),getchar(), system("pause")atau sampah lain. Mengubah ini berfungsi.
Callat
Ctrl + F5 berarti 'Mulai Tanpa Debugging'. Jadi, Anda tidak dapat menggunakan ini saat debugging. Tambahkan saja system("pause");di akhir kode Anda. Masuk akal dan bekerja dengan baik.
Milad
41

Cara standar adalah cin.get()sebelum pernyataan pengembalian Anda.

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    cin.get();
    return 0;
}
Gordon Wilson
sumber
4
Saya tahu karena program ini sudah menggunakan cout yang sudah diurus, tapi saya pikir ada baiknya untuk menyebutkan bahwa Anda perlu #include <iostream> serta menggunakan std namespace: std :: cin.get () .
Brian
7
Ini berfungsi tetapi Ctrl + F5 jauh lebih baik terutama ketika melacak kehancuran objek global, dll.
Ternary
8
-1 untuk _tmain. Saya akan memilih -1 lain untuk cin.get()bukannya menempatkan breakpoint untuk F5 atau menggunakan Ctrl F5. Tapi saya hanya diizinkan satu downvote.
Ceria dan hth. - Alf
8
@Cheers: Ada apa dengan ini _tmain? Itulah cara standar untuk menulis aplikasi Windows yang menargetkan subsistem Konsol. Menyimpang dari standar itu adalah praktik yang buruk. Jelas, tidak ada yang berbicara tentang kode portabel di sini; pertanyaannya mengatakan Visual C ++ dan _tmainmerupakan tanda tangan yang muncul dalam kode sampel. Sudah waktunya untuk melepaskan agama ini. Windows "non-standar" secara default, dan ada alasan yang sangat baik untuk mengikuti nya standar.
Cody Gray
8
@CodyGray: Downvote saya _tmainadalah karena ini benar-benar tidak perlu ( standar C ++ internasional membutuhkan yang sederhana main), dan karena menggunakan Tskema makro Microsoft , yang merupakan komplikasi dan bertele-tele yang tidak perlu untuk mendukung Windows 9x. Jika Anda merasa menyimpang dari standar adalah praktik yang buruk, maka Anda harus benar-benar tidak menggunakannya tmain. Tidak ada alasan yang baik untuk menggunakan tmain, kecuali untuk trolling atau, untuk profesional, untuk menampilkan ketidakmampuan total seseorang.
Ceria dan hth. - Alf
24

Letakkan breakpoint pada return telepon.

Anda menjalankannya di debugger, bukan?

Sam Harwell
sumber
15
paling sulit karena mungkin ada beberapa titik keluar di dalam program
volzotan
Program ini mungkin tidak mulai karena DLL hilang, dan tidak pernah mencapai breakpoint itu
Michael
18

Pilihan lain adalah menggunakan

#include <process.h>
system("pause");

Meskipun ini tidak terlalu portabel karena hanya akan bekerja pada Windows, tetapi ini akan secara otomatis dicetak

Tekan tombol apa saja untuk melanjutkan...

Marcos Marin
sumber
1
system ("pause") Akan membuat prosesor Anda berjalan, itu tidak boleh digunakan. Gunakan cin.get () atau yang setara.
Krythic
systemdinyatakan dalam <stdlib.h>.
melpomene
@Krythic Saya baru mencobanya dan tidak memakan CPU 100%. Penggunaan prosesor saya adalah 0% - 1% sepanjang waktu. Tidak dapat mereproduksi
melpomene
sistem ("pause") akan memanggil perintah "pause" dalam cmd, yang TIDAK menggunakan CPU sepanjang waktu. Ini setara dengan _getche () pada dasarnya.
Paul Stelian
7

Untuk proyek makefile, solusi yang diterima gagal, karena bug di Visual Studio (yang hadir setidaknya hingga versi 2012 - saya belum menguji 2013). Bug ini dirinci di sini .

Untuk menghentikan konsol setelah penghentian program pada proyek makefile, lakukan langkah-langkah ini (ini mungkin berbeda untuk versi selain 2010 - 2012):

1) Lulus /SUBSYSTEM:CONSOLEke tautan. - EDIT : lihat di bawah.

2) Buka file proyek Anda (.vcxproj) dalam editor teks.

3) Di dalam <project>tag root , masukkan yang berikut ini:

<ItemDefinitionGroup>
  <Link>
    <SubSystem>Console</SubSystem>
  </Link>
</ItemDefinitionGroup>

4) Muat ulang proyek dalam solusi Anda.

5) Jalankan program tanpa debugging (CTRL + F5).

EDIT:

Seperti komentar saya di bawah ini, pengaturan opsi tautan /SUBSYSTEM:CONSOLEsebenarnya tidak relevan untuk proyek makefile (dan bahkan belum tentu mungkin, jika Anda menggunakan kompiler selain MSVC). Yang penting adalah bahwa pengaturan ditambahkan ke file .vcxproj, seperti langkah 3 di atas.

JBentley
sumber
Saya belum pernah mendengar tentang langkah 3 sebelumnya. Anda yakin itu diperlukan dan berfungsi?
Mooing Duck
@ mooingduck Ya, dan setelah komentar saya pada jawaban Anda di sini , saya sekarang telah menemukan bahwa beralih /SUBSYSTEM:CONSOLEke linker sebenarnya tidak relevan - langkah 3 adalah yang terpenting. Ingat jawaban saya berkaitan dengan proyek makefile - dalam proyek makefile, IDE tidak memiliki cara untuk mengetahui apa yang Anda sampaikan ke linker (Anda bahkan mungkin tidak menggunakan kompiler yang memiliki /SUBSYSTEM:CONSOLEopsi), dan itu adalah proyek sendiri yang melacak apakah itu dimaksudkan untuk menjadi program konsol. Saya akan mengedit jawaban saya sesuai.
JBentley
1
@ mooingduck Saya juga dapat mengkonfirmasi bahwa saya menggunakan solusi ini sendiri dalam proyek makefile, dengan SCons sebagai sistem build, dan MSVC dan MinGW sebagai kompiler. Tidak ada cara lain yang saya tahu untuk mendapatkan IDE untuk menjeda konsol setelah penghentian dalam mode non-debugging.
JBentley
1
@ chuckleplant Saya khawatir tidak, alur kerja saya adalah sebaliknya, memanggil SCons dari VS. Saya awalnya secara manual membuat proyek VS makefile saya sehingga mereka melewati variabel konfigurasi ke skrip SCons saya (misalnya 32/64 bit, nama kompiler, rilis / debug), yang kemudian menangani sisa logika. Dalam pengaturan itu tidak perlu file proyek untuk pernah berubah, jadi saya tidak menggunakan fitur auton penghasil otomatis. Saya sudah beralih ke Linux jadi saya tidak menggunakan VS lagi. Karena ini adalah bug VS, mungkin perlu mengirimkan permintaan fitur ke SCons untuk menangani langkah tambahan yang diperlukan.
JBentley
1
Atau, Anda bisa memasukkan beberapa kode Python ke skrip SCons Anda untuk melakukannya sendiri setiap kali file proyek dibuat. Saya percaya file proyek VS sesuai dengan standar XML, jadi seharusnya cukup mudah untuk menambahkan elemen yang hilang, dan seharusnya hanya memerlukan beberapa baris kode. Saya akan menyarankan mulai di sini (untuk Python 2.x) atau di sini (3.x). Jawaban ini mungkin juga menarik.
JBentley
4

Anda dapat menggunakan cin.get();atau cin.ignore();tepat sebelum pernyataan pengembalian untuk menghindari jendela konsol tertutup.

CMS
sumber
4

cukup letakkan breakpoint pada braket keriting terakhir utama.

    int main () {
       //...your code...
       return 0;
    } //<- breakpoint here

ini berfungsi untuk saya, tidak perlu dijalankan tanpa debugging. Ia juga mengeksekusi destruktor sebelum mengenai breakpoint sehingga Anda dapat memeriksa pesan apa pun yang dicetak pada destruktor ini jika ada.

Juan Castano
sumber
3

Cukup tambahkan Breakpoint ke braket penutup _tmainmetode Anda . Ini adalah cara yang lebih mudah plus Anda tidak perlu menambahkan kode untuk melakukan debug.

Odys
sumber
2

Tempatkan breakpoint pada penjepit akhir main(). Itu akan tersandung bahkan dengan beberapa returnpernyataan. Satu-satunya downside adalah bahwa panggilan untukexit() tidak ditangkap.

Jika Anda tidak men-debug, ikuti saran dalam jawaban Zoidberg dan mulai program Anda dengan Ctrl+ F5alih-alih adil F5.

Chad
sumber
2

2 Sen Saya:

Pilihan 1: Tambahkan breakpoint di akhir main()

Pilihan 2: Tambahkan kode ini, tepat sebelum return 0;:

std::cout << "Press ENTER to continue..."; //So the User knows what to do
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Anda harus memasukkan <iomanip>untukstd::numeric_limits

Arnav Borborah
sumber
2

tambahkan saja sistem ("jeda") di akhir kode sebelum mengembalikan 0 seperti ini

#include <stdlib.h>

int main()
{
    //some code goes here
    system("pause")
    return 0;
}
melpomene
sumber
2
int main()
{
    //...
    getchar();
    return 0;
}
akanvis
sumber
2

cin.get(), atau system("PAUSE"). Saya belum pernah mendengar Anda bisa menggunakannyareturn(0);

Udhav Sarvaiya
sumber
1

Saya sertakan #include <conio.h>dan kemudian, tambahkan getch();tepat sebelum return 0;baris. Itulah yang saya pelajari di sekolah. Metode yang disebutkan di atas sangat berbeda.

Amruth Pillai
sumber
2
-1: Selain dari fakta bahwa menghentikan program itu sendiri biasanya merupakan solusi yang salah (karena dalam kebanyakan kasus itu bukan perilaku yang Anda inginkan untuk memiliki biner yang dirilis), conio.h tidak standar , ketinggalan jaman, dan merupakan Header C, bukan C ++! Sayangnya, ada banyak praktik pemrograman yang buruk yang diajarkan di sekolah.
JBentley
Satu mengharapkan ini akan digunakan selama pengujian saja, itu bukan sesuatu yang Anda simpan di versi final. Jika Anda mengkode untuk Windows, apa masalahnya dengan #include <conio.h> / _getch () ;? Lebih cepat menulis daripada cin.get (), tidak perlu menekan 2 tombol (setidaknya karakter + enter), dan tidak berfungsi hanya dalam debug atau hanya dalam mode rilis. Apa yang salah?
Barnack
1

Punya masalah yang sama. Saya menggunakan _getch()tepat sebelum pernyataan kembali. Berhasil.

Martin
sumber
Anda mungkin ingin menambahkan contoh dan penjelasan ke kode Anda, terutama untuk pertanyaan yang ditanyakan / dijawab dulu. Selain itu, jawaban Anda identik secara fungsional dengan beberapa jawaban lama, dan menggunakan panggilan yang sama dengan jawaban lain yang sudah ada.
Clockwork-Muse
0

(Beberapa opsi dapat dipanggil dengan nama yang berbeda. Saya tidak menggunakan versi bahasa Inggris)

Saya memiliki masalah yang sama, ketika saya membuat proyek dengan opsi "proyek kosong", Buat proyek sebagai "aplikasi konsol Win32" alih-alih "proyek kosong". Dalam dialog yang muncul sekarang, Anda menekan "lanjutkan" dan setelah itu Anda dapat memeriksa opsi "kosongkan proyek" dan tekan konfirmasi. Setelah itu CTRL + F5 akan membuka konsol yang tidak menutup secara otomatis.

Blechdose
sumber
0

Saya memiliki masalah yang sama; Dalam aplikasi saya ada beberapa titik keluar () poin dan tidak ada cara untuk mengetahui di mana tepatnya keluar, maka saya menemukan hal ini:

atexit(system("pause"));

atau

atexit(cin.get());

Dengan cara ini akan berhenti di mana pun kita keluar di program.

Charaf Errachidi
sumber
Tak satu pun dari itu adalah panggilan yang valid atexit. atexitmengambil pointer fungsi, bukan bilangan bulat.
melpomene
0

Pilihan lain:

#ifdef _WIN32
#define MAINRET system("pause");return 0
#else
#define MAINRET return 0
#endif

Di utama:

int main(int argc, char* argv[]) {
    MAINRET;
}
chen_767
sumber
0

Sebenarnya, solusi sebenarnya adalah pemilihan templat proyek itu sendiri. Anda HARUS memilih Aplikasi Konsol Win32 di VS yang lebih lama, atau mengisi nama proyek terlebih dahulu kemudian klik dua kali pada Windows Desktop wizard dan kemudian pilih aplikasi konsol Win32. Kemudian pilih proyek kosong pada titik ini. Ini kemudian memungkinkan untuk apa yang benar-benar diinginkan penanya tanpa menambahkan titik pemberhentian tambahan dan menyimpan kode. Saya juga mengalami masalah ini. Jawabannya juga ada di situs MSDN.

pengguna9416431
sumber
0

Berikut adalah cara untuk menjaga jendela perintah tetap terbuka terlepas dari bagaimana eksekusi berhenti tanpa mengubah kode apa pun:

Di Visual Studio, buka Halaman Properti Proyek -> Debugging .

Untuk Perintah , masukkan$(ComSpec)

Untuk Argumen Perintah , masukkan /k $(TargetPath). Tambahkan argumen apa pun ke aplikasi Anda sendiri.

Sekarang F5 atau Ctrl-F5 mengeksekusi Windows / System32 / cmd.exe di jendela baru, dan / k memastikan bahwa prompt perintah tetap terbuka setelah eksekusi selesai.

Kelemahannya adalah eksekusi tidak berhenti pada breakpoints.

Jonathan Lidbeck
sumber
0

Seperti yang telah ditunjukkan oleh beberapa orang, solusi Zoidberg tidak melampirkan debugger, yang biasanya tidak Anda inginkan.

Opsi imo terbaik adalah untuk mengkonfigurasi VS Anda sesuai (dari VS 2017 dan seterusnya), dengan pergi ke Tools> Options> Debugging> General. Di sana Anda menghapus centang "Secara otomatis menutup konsol ketika debugging berhenti" (di bagian paling bawah), yang mungkin diperiksa dalam kasus Anda.

iko79
sumber
-1

Anda bisa menaruh keep_window_open (); sebelum kembali ke sini adalah salah satu contoh

int main()
{
    cout<<"hello world!\n";
    keep_window_open ();
    return 0;
}
Sifis Babionitakis
sumber
2
Di mana keep_window_open () berasal, misalnya file header & pustaka mana?
Tom Goodfellow
ini berasal dari std_lib_facilities.h yang satu ini tetapi sebagian besar waktu sudah termasuk
Sifis Babionitakis