Konsol penceresi Visual C ++ ile nasıl açık tutulur?


191

Visual C ++ ile başladım ve konsol penceresini nasıl tutacağımı bilmek istiyorum.

Örneğin, bu tipik bir "merhaba dünya" uygulaması olacaktır:

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

Kaçırdığım çizgi nedir?


Amruth A. Pillai kodunuz "devam etmek için herhangi bir tuşa basın" göstermiyor

Bunu basit bir std :: cout çağrısı ile yazdırabilirsiniz.
Raúl Roa

5
Önerilen tüm çözümlerin dezavantajı, hiçbirinin hata ayıklama ile çalışmadığı (Ctrl + F5 burada başarısız) ve uygulama beklenmedik bir şekilde durduğunda (ana dönüşte stdin'den gelen tüm kesme noktaları veya okumalar burada başarısız olur). Görmek istediğim, Eclipse ve diğer IDE'lerin sahip olduğu bir IDE konsol penceresi. Program bittikten sonra stdout / stderr çıktısını göstermeye devam ederler.
dr. Sybren

@sybren Kabul edilen yanıt CTRL + F5 ile çalışır ve neden hata ayıklama (F5) ile çalışan bir çözüm istesin ki? Şüphesiz hata ayıklama bütün mesele .. hata ayıklama? Hata ayıklama oturumunda, program sonlandırıldıktan sonra duraklatılmış bir konsola sahip olmanın avantajı nedir?
JBentley

2
@JBentley Eclipse ve diğer IDE'ler, işlem sonlandırıldıktan sonra bile programınızın çıktısını okumanızı sağlar. Tabii ki, özellikle bir hata bulmaya çalışırken, ek avantajı görüyor musunuz? Ayrıca bir kesme noktası yalnızca programın nerede sonlandığını bildiğinizde çalışır, bu da çıktının ekranınızdan ne zaman kaybolduğunu söylemek zor olabilir.
dr. Sybren

Yanıtlar:


389

Projeyi Ctrl+F5sadece yerine ile başlatın F5.

Konsol penceresi Press any key to continue . . .program çıktıktan sonra artık mesajla birlikte açık kalacaktır .

Console (/SUBSYSTEM:CONSOLE)Bunun, aşağıdaki gibi etkinleştirebileceğiniz bağlayıcı seçeneğini gerektirdiğini unutmayın :

  1. Projenizi açın ve Çözüm Gezgini'ne gidin. K&R'de benimle birlikte takip ediyorsanız, "Çözümünüz" altında 1 proje ile 'merhaba' olacak, ayrıca cesurca 'merhaba' olacaktır.
  2. 'Merhaba' (veya proje adınız ne olursa olsun) üzerine sağ tıklayın.
  3. Bağlam menüsünden "Özellikler" i seçin.
  4. Yapılandırma Özellikleri> Bağlayıcı> Sistem'i seçin.
  5. Sağ taraftaki bölmedeki "Alt Sistem" özelliği için sağ taraftaki sütundaki açılır kutuyu tıklayın.
  6. "Konsol (/ SUBSYSTEM: CONSOLE)" seçeneğini seçin
  7. Uygula'yı tıklayın, ne yaparsa yapsın bitmesini bekleyin, ardından Tamam'ı tıklayın. ("Uygula" gri renkteyse, başka bir alt sistem seçeneği belirleyin, Uygula'yı tıklayın, ardından geri dönün ve konsol seçeneğini uygulayın. Deneyimim, tek başına Tamam'ın çalışmayacağıdır.)

CTRL-F5 ve alt sistem ipuçları birlikte çalışır; ayrı seçenekler değildir.

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


36
Bu, programı hata ayıklamadan çalıştırır; hem hata ayıklama hem de normal çalışma modunda çalışan bir çözüme sahip olmak daha iyidir.
ー: ー フ ァ ミ コ ン

3
Bu çözümü bir makefile projesinde çalışmak için alamayan herkes için, bu Visual Studio bir hata nedeniyle. Düzeltme ile yeni bir cevap gönderdim.
JBentley

1
Onaylayabilir! Bu işe yaramadı bir konsol uygulaması vardı ve işe yaradı. Kodunuzu cin.get(),getchar(), system("pause")veya başka bir çöp ile değiştirmeniz gerekmez . Bunu değiştirmek işe yarar.
Callat

Ctrl + F5, 'Hata Ayıklamadan Başlat' anlamına gelir. Bu yüzden hata ayıklarken bunu kullanamazsınız. Sadece system("pause");kodunuzun sonuna ekleyin . Mantıklı ve iyi çalışıyor.
Milad

41

Standart yol cin.get()iade beyanınızdan önce.

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

4
Program zaten halledildiğini cout kullandığından biliyorum, ancak std isim alanını kullanmanın yanı sıra <iostream> 'i de eklemeniz gerekeceğini düşünüyorum. Std :: cin.get () .
Brian

7
Bu işe yarıyor ancak Ctrl + F5 özellikle küresel nesne imhası vb.
İzlenirken

8
-1 için _tmain. cin.get()F5 için bir kesme noktası yerleştirmek veya Ctrl F5 kullanmak yerine başka bir -1 oy verirdim . Ama sadece bir inişe izin verdim.
Şerefe ve s. - Alf

8
@Cheers: Sorun nedir _tmain? Konsol alt sistemini hedefleyen bir Windows uygulaması yazmanın standart yolu budur. Bu standarttan sapmak kötü uygulama olacaktır. Açıkçası, hiç kimse burada taşınabilir kod hakkında konuşmuyor; soru Visual C ++ diyor _tmainve örnek kodda görünen imza. Bu dini bırakma zamanı. Windows varsayılan olarak "standart dışı" dır ve standartlarını takip etmenin çok iyi nedenleri vardır .
Cody Gray

8
@CodyGray: Benim aşağı oyum _tmain, tamamen gereksiz standart olmayan (uluslararası C ++ standardı bir düz gerektirir main) ve Microsoft'un TWindows 9x'i desteklemek için gereksiz bir karmaşıklık ve söz konusu olan makro şemasını kullandığı için. Standarttan sapmanın kötü bir uygulama olduğunu düşünüyorsanız, kesinlikle kullanmamalısınız tmain. tmainTrolling veya profesyoneller için kişinin toplam yetersizliğini göstermek için kullanmanın iyi bir nedeni yoktur .
Şerefe ve s. - Alf

24

Çizgiye bir kesme noktası koyun return.

Hata ayıklayıcıda çalıştırıyorsunuz, değil mi?


15
programın içinde birden fazla çıkış noktası olabileceği için çoğu zaman zor
volzotan

Program, eksik DLL nedeniyle başlamayabilir ve bu kesme noktasına asla
Michael

18

Başka bir seçenek kullanmak

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

Bu çok taşınabilir olmasa da, yalnızca Windows üzerinde çalışacak, ancak otomatik olarak yazdırılacak

Devam etmek için herhangi bir tuşa basın...


1
system ("pause") İşlemcinizin çalışmaya devam etmesini sağlar, kullanılmamalıdır. Cin.get () veya eşdeğerini kullanın.
Krythic

systemilan edildi <stdlib.h>.
melpomene

@Krythic Sadece denedim ve% 100 CPU yemedi. İşlemci kullanımım her zaman% 0 -% 1 arasındaydı. Çoğaltamıyor.
melpomene

system ("pause"), cmd cinsinden "pause" komutunu çağırır ve bu işlem CPU'yu her zaman KULLANMAZ. Temelde _getche () işlevine eşdeğerdir.
Paul Stelian

7

Makefile projeleri için, Visual Studio'daki bir hata nedeniyle kabul edilen çözüm başarısız olur (en azından 2012 sürümüne kadar mevcut - 2013'ü henüz test etmedim). Bu hata burada ayrıntılı .

Bir makefile projesinde program sonlandırıldıktan sonra konsolun duraklaması için aşağıdaki adımları uygulayın (bu, 2010-2012 dışındaki sürümler için farklılık gösterebilir):

1) /SUBSYSTEM:CONSOLEBağlayıcıya geçin. - DÜZENLEME : aşağıya bakın.

2) Proje dosyanızı (.vcxproj) bir metin düzenleyicide açın.

3) Kök <project>etiketinin içine aşağıdakileri ekleyin:

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

4) Çözümünde projeyi yeniden yükleyin.

5) Hata ayıklamadan programı çalıştırın (CTRL + F5).

DÜZENLE:

Aşağıdaki yorumuma göre, linker seçeneğini ayarlamak /SUBSYSTEM:CONSOLEmakefile projeleri için gerçekten önemsizdir (ve MSVC dışında bir derleyici kullanıyorsanız mutlaka mümkün değildir). Önemli olan tek şey, yukarıdaki adım 3'e göre ayarın .vcxproj dosyasına eklenmiş olmasıdır.


Bu adımı daha önce hiç duymamıştım. Bunun gerekli olduğundan ve çalıştığından emin misiniz?
Mooing Ördek

@mooingduck Evet, ve burada cevabınızla ilgili yorumlarımdan sonra , şimdi /SUBSYSTEM:CONSOLEbağlayıcıya geçmenin aslında önemsiz olduğunu keşfettim - 3. adım önemli olan tek şey. Cevabımın makefile projeleriyle ilgili olduğunu unutmayın - bir makefile projesinde, IDE'nin linkere neyi geçtiğinizi bilmenin bir yolu yoktur (hatta bir /SUBSYSTEM:CONSOLEseçeneği olan bir derleyici kullanmıyor olabilirsiniz ) ve proje kendisi bir konsol programı olup olmadığını takip eder. Cevabımı buna göre düzenleyeceğim.
JBentley

1
@mooingduck Bu çözümü kendim bir makefile projesinde, derleme sistemi olarak SCons ve derleyiciler olarak MSVC ve MinGW ile kullandığımı doğrulayabilirim. Hata ayıklama olmayan modda sonlandırıldıktan sonra IDE'yi konsolu duraklatmasını sağlamanın başka bir yolu yoktur.
JBentley

1
@chuckleplant Korkmuyorum, iş akışım tam tersi oldu, VS'den SCons çağırdı. Başlangıçta VS makefile projelerimi oluşturdum, böylece SCons betiğime (örneğin 32/64 bit, derleyici adı, yayın / hata ayıklama) yapılandırma değişkenlerini geçtiler, bu da mantığın geri kalanını işledi. Bu kurulumda proje dosyalarının değişmesine gerek yoktu, bu yüzden SCons'un otomatik oluşturma özelliğini kullanmadım. O zamandan beri Linux'a geçtim, bu yüzden artık VS kullanmıyorum. Bir VS hatası olduğundan, gerekli ek adımı işlemek için SCons'a bir özellik isteği göndermeye değer olabilir.
JBentley

1
Alternatif olarak, bir proje dosyası her oluşturulduğunda bunu yapmak için SCons betiğinize bazı Python kodları ekleyebilirsiniz. VS proje dosyalarının XML standardına uygun olduğuna inanıyorum, bu yüzden eksik öğeleri eklemek oldukça kolay olmalı ve sadece birkaç satır kod gerektirmelidir. Buradan (Python 2.x için) veya burada (3.x) başlamanızı öneririm . Bu cevap da ilgi çekici olabilir.
JBentley

4

Konsol penceresinin kapanmasını önlemek için dönüş ifadenizden hemen önce cin.get();veya kullanabilirsiniz cin.ignore();.


4

sadece ana son kıvrımlı parantezine bir kesme noktası koyun.

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

benim için çalışıyor, hata ayıklamadan çalıştırmaya gerek yok. Ayrıca kesme noktasına çarpmadan önce yıkıcıları yürütür, böylece bu yıkıcılara yazdırılan iletileri kontrol edebilirsiniz.


3

Metodunuzun kapanış köşesine bir kesme noktası eklemeniz yeterlidir _tmain. Bu daha kolay bir yoldur ve hata ayıklamak için kod eklemenize gerek yoktur.


2

Öğesinin bitiş ayracı üzerine bir kesme noktası yerleştirin main(). Birden fazla returnifadeyle bile tetiklenir . Tek dezavantajı, bir çağrı exit()yakalanmayacak olmasıdır.

Hata ayıklama yapmıyorsanız, Zoidberg'in cevabındaki tavsiyelere uyun ve programınıza sadece yerine Ctrl+ ile başlayın .F5F5


2

2 sentim:

Seçenek 1: Sonuna kesme noktası ekleyin main()

2. Seçenek: Bu kodu aşağıdakilerden hemen önce ekleyin 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');

Sen eklemeniz gerekir <iomanip>içinstd::numeric_limits


2

bunun gibi 0 döndürmeden önce kodun sonuna system ("pause") ekleyin

#include <stdlib.h>

int main()
{
    //some code goes here
    system("pause")
    return 0;
}



1

Ben dahil #include <conio.h>ve daha sonra ekleme getch();hemen önce return 0;hat. Zaten okulda öğrendim. Yukarıda bahsedilen yöntemler gördüğümden oldukça farklı.


2
-1: Programın kendisinin duraklamasına sahip olmanın genellikle yanlış çözüm olmasının yanı sıra (çoğu durumda, serbest bırakılan ikili kodunuzun olmasını istediğiniz davranış bu değildir), conio.h standart dışı , modası geçmiş ve C başlığı, C ++ değil! Ne yazık ki, okullarda öğretilen birçok kötü programlama uygulaması vardır.
JBentley

Biri bunun sadece test sırasında kullanılmasını bekliyor, bu son sürümde saklayacağınız bir şey değil. Windows için kod yazıyorsanız #include <conio.h> / _getch (); Cin.get () 'den daha hızlı yazılır, 2 tuşa (en az bir karakter + enter) basmanız gerekmez ve yalnızca hata ayıklamada veya yalnızca serbest bırakma modunda çalışmaz. O zaman sorun ne?
Barnack

1

Aynı sorun vardı. _getch()Dönüş ifadesinden hemen önce kullanıyorum . İşe yarıyor.


Özellikle uzun zaman önce sorulan / cevaplanan bir soru için kodunuza örnekler ve açıklamalar eklemek isteyebilirsiniz. Buna ek olarak, yanıtı işlevsel olarak birkaç eski cevapla aynıdır ve mevcut başka bir cevapla aynı çağrıyı kullanır.
Clockwork-Muse

0

(Bazı seçenekler farklı isimlerle çağrılabilir. İngilizce sürümünü kullanmıyorum)

"Boş proje" seçeneği ile projeler oluşturduğumda, "Boş proje" yerine "Win32-konsol uygulaması" olarak proje oluştur aynı sorunu yaşadım. Şimdi açılan iletişim kutusunda "devam" düğmesine basarsınız ve bundan sonra "boş proje" seçeneğini işaretleyebilir ve onayla düğmesine basabilirsiniz. Bundan sonra CTRL + F5 otomatik olarak kapanmayan bir konsol açar.


0

Aynı sorunu yaşadım; Uygulamamda birden fazla çıkış () noktası var ve tam olarak nereden çıktığını bilmenin bir yolu yoktu, o zaman bunu öğrendim:

atexit(system("pause"));

veya

atexit(cin.get());

Bu şekilde, programdan nereden çıkarsak çıkalım durur.


Bunların hiçbiri geçerli çağrı değil atexit. atexitbir tamsayı değil, bir işlev işaretçisi alır.
melpomene

0

Başka seçenek:

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

Esas olarak:

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

0

Aslında, gerçek çözüm proje şablonunun kendisinin seçilmesidir. Eski VS'de Win32 Konsol Uygulaması'nı seçmeli veya önce proje adını doldurmalı ve ardından Windows Masaüstü sihirbazını çift tıklatmalı ve ardından Win32 konsol uygulamasını seçmelisiniz. Ardından bu noktada boş bir proje seçin. Bu, orijinal sorgulayıcının ekstra durma noktası ve bekletme kodu eklemeden gerçekten ne istediğini sağlar. Ben de bu sorunu yaşadım. Cevap MSDN sitesinde de var.


0

Aşağıda, herhangi bir kodu değiştirmeden yürütmenin nasıl durduğundan bağımsız olarak komut penceresini açık tutmanın bir yolu vardır:

Visual Studio'da Proje Özellik Sayfaları -> Hata Ayıklama'yı açın .

İçin Komutanlığı , girmek$(ComSpec)

İçin Komut bağımsız değişkenleri girin /k $(TargetPath). Kendi uygulamanıza herhangi bir argüman ekleyin.

Şimdi F5 veya Ctrl-F5, Windows / System32 / cmd.exe dosyasını yeni bir pencerede yürütür ve / k , yürütme tamamlandıktan sonra komut isteminin açık kalmasını sağlar.

Dezavantajı, yürütmenin kesme noktalarında durmamasıdır.


0

Bazılarının işaret ettiği gibi, Zoidbergs çözümü hata ayıklayıcıyı takmaz, bu genellikle istemediğiniz bir şeydir.

En iyi seçenek imo, Araçlar> Seçenekler> Hata Ayıklama> Genel'e giderek VS'nizi buna göre yapılandırmaktır (VS 2017'den itibaren). Burada, büyük olasılıkla sizin durumunuzda kontrol edilen "Hata ayıklama durduğunda konsolu otomatik olarak kapat" seçeneğinin işaretini kaldırın (en altta).


-1

keep_window_open () koyabilirsiniz; buraya dönmeden önce bir örnek

int main()
{
    cout<<"hello world!\n";
    keep_window_open ();
    return 0;
}

2
Keep_window_open () nereden geliyor, örn. Hangi header file & library?
Tom Goodfellow

onun bu bir std_lib_facilities.h ama çoğu zaman dahil
Sifis Babionitakis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.