C ++ konsol uygulamasının hemen çıkmasını nasıl engelleyebilirim?


193

Son zamanlarda, bu web sitesinden C ++ öğrenmeye çalışıyorum . Ne yazık ki kod örneklerinden birini çalıştırmayı denediğimde, programın yaklaşık yarım saniye açık kaldığını ve hemen kapandığını görüyorum. Çabalarımın meyvelerini görebilmek için programın hemen kapanmasını engellemenin bir yolu var mı?


5
Yürütülebilir dosyayı çift tıklıyor musunuz? Windows'da mı çalışıyorsunuz? Neden Komut kabuğundan çalışmıyor ve komutların yürütülmesini istediğiniz şekilde yazmıyorsunuz?
S.Lott

8
@S Lott: Çünkü IDE'nizdeki "Git" düğmesine basarsanız bir konsolla uğraşmanıza gerek kalmaz.
Billy ONeal

4
C ++ öğrenmek için iyi bir kitap almayı düşünmelisiniz. Web siteleri iyi kaynaklardır, ancak iyi bir tanıtım metniyle eşleşmez. Burada C ++ kitaplarının kesin bir listesi var: stackoverflow.com/questions/388242/…
James McNellis

6
@Billy Git düğmesine basıldığında uygulama sona erdiğinde kapanırsa, yanlış IDE kullanıyorsunuz demektir.

2
Burada daha önce sorulmuş ve cevaplanmıştır: stackoverflow.com/questions/902261/… , ancak bunun daha iyi bir başlığı var.
dmckee --- eski moderatör yavru kedi

Yanıtlar:


121

Düzenleme: Charles Bailey haklı olarak aşağıdaki bir yorumda işaret ettiği gibi, arabelleklenmiş karakterler varsa bu işe yaramaz stdinve bunun etrafında çalışmak için gerçekten iyi bir yol yoktur. Bir hata ayıklayıcı ekli olarak çalıştırıyorsanız, John Dibling'in önerdiği çözüm muhtemelen sorununuza en temiz çözümdür.

Bununla birlikte, bunu burada bırakacağım ve belki başka biri faydalı bulacaktır. Geliştirme sırasında testler yazarken bunu hızlı bir tür kesmek olarak kullandım.


mainİşlevinizin sonunda,std::getchar();

Bu tek bir karakter alır stdin, böylece "devam etmek için herhangi bir tuşa basın" tür davranış verir (aslında "herhangi bir tuşa basın" mesajı istiyorsanız, kendiniz yazdırmanız gerekir).

Buna gerek #include <cstdio>için getchar.


15
getcharsorunu çözmez - ya da en azından sınırlı koşullarda. Bir karakter okur stdin, ancak stdin'den arabelleğe alınmış karakterler varsa, program bir istem yazdırıp yazdırmamanıza bakılmaksızın beklemeden devam eder.
CB Bailey

1
@Charles: İyi bir nokta. Kadar yoksaymak \nkısmi bir çözümdür, ancak birden fazla girdi satırı arabelleğe alınırsa yardımcı olmaz. Giriş akışından her şeyi temizlemek için standart bir C ++ yolu bilmiyorum. : - /
James McNellis

1
@James: Eski, ama nasıl std::cin.ignore(std::cin.rdbuf()->in_avail());? Buradan anladım .
GManNickG

1
Ben çok kullanmak Seçeneklerden biri olduğu std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');ile #include <limits>.
Xeo

5
Lütfen bunu yapma. :( Programınızın bunu yapmasının bir parçası değil.
Orbit'teki Hafiflik Yarışları

138

Visual Studio kullanıyorsanız ve konsol uygulamasını IDE dışında başlatıyorsanız:

CTRL-F5'e (hata ayıklamadan başla) basmak uygulamayı başlatır ve siz herhangi bir tuşa basıncaya kadar konsol penceresini açık tutar.


1
Konsolu IDE'den başlatmak mı istiyorsunuz? Bunu nasıl ve neden yaptın?
CodyBugstein

1
Mükemmel, işe yaradı. Neden bu, Visual Studio'nun varsayılan davranışı değil?
Armatür

Ben de bunu yapmanın bir yolu olduğunu düşündüm, bugüne kadar basit bir konsol programı oluşturduğumda ve yukarıdaki yöntem işe yaramadı :(
KansaiRobot

1
Hata ayıklama ile bunun bir sürümü var mı ?
luckyging3r

109

James'in çözümü tüm Platformlar için çalışıyor.

Alternatif olarak Windows, mainişlevden dönmeden hemen önce aşağıdakileri de ekleyebilirsiniz :

  system("pause");

Bu, pausebir tuşa basana kadar bekleyen ve aynı zamanda hoş bir mesaj görüntüleyen komutu çalıştıracaktır.Press any key to continue . . .


2
Bu, bir çözümün Rube Goldberg varyasyonu gibi geliyor.
Dave Van den Eynde

4
@Dave Van den Eynde: Aynı zamanda oldukça yaygındır ve DevCPP'deki kaynak plakası kodunda standart olarak gelir. +1
Billy ONeal

4
@ Öte yandan, bunun bir örnek için sadece bir bodse olduğunu açıkça belirtirken, std: getch yanlışlıkla gerçek kodda bırakılabilir.
Martin Beckett

2
Bu, Windows'takiler için mükemmel bir çözümdür. İdeal olmasa da, işe yarıyor
thecoshman

En kolay, en hızlı çözüm. Tam ihtiyacım olan şey
CodyBugstein

83

Microsoft Visual C ++ 2010 Express kullanıyorsanız ve program sona erdikten sonra konsolu açık tutmak için çalışmıyor CTRL + F5 ile ilgili sorunla karşılaşırsanız , bu MSDN iş parçacığına bir göz atın .

Bir CTRL + F5 çalıştırmasından sonra IDE'niz konsolu kapatacak şekilde ayarlanmış olabilir; aslında, Visual C ++ 2010'da bir "boş proje" konsolu varsayılan olarak kapatır. Bunu değiştirmek için Microsoft Moderatör'ün önerdiği gibi yapın:

Lütfen proje adınıza sağ tıklayın ve Özellikler sayfasına gidin, lütfen Yapılandırma Özellikleri -> Bağlayıcı -> Sistem'i genişletin, lütfen Alt Sistem açılır menüsünden Konsol (/ SUBSYSTEM: CONSOLE) öğesini seçin. Çünkü, varsayılan olarak, Boş proje bunu belirtmez.


1
Bir konsol uygulaması değilse ne olur?
Jesse Pepper

3
@ Mr.Underhill Bu, yalnızca hata ayıklayıcı (Ctrl + F5) olmadan başlatırsanız çalışır.
Jonathan Mee

Kesmek olmayan tek çözüm olmanın yanı sıra, bu aynı zamanda ana yığın nesneleri yıkıcılarından gelen baskıları görmenin tek yoludur.
Poniros

20

Genellikle main()kapanıştaki süslü ayraç üzerine bir kesme noktası koydum . Programın sonuna ne zaman ulaşılırsa kesme noktası vurulacaktır ve çıktıyı görmek için konsol penceresine ALT-Tab yapabilirsiniz.


14

Neden programı sadece bir konsoldan çalıştırmıyorsunuz, yani programı Windows kullanıyorsanız cmd.exe'den çalıştırın. Bu şekilde program bittikten sonra pencere açık kalır.

[EDIT]: KDevelop4'ü kullandığımda IDE'nin altındaki bir sekmede çalışan tam teşekküllü bir Bash (Linux CLI) örneği var. Bu tür koşullarda kullandığım şey bu.


3
Çünkü bir IDE kullanıyorsanız genellikle bir konsol kullanmazsınız. Siz gidin, program çalışır ve hepsi bu.
Billy ONeal

3
Uygulama sona erdiğinde herhangi bir yetkili IDE konsolu ekranda tutacaktır - Örneğin Code :: Blocks tam olarak bunu yapar.

3
@nobugz: Anladım. Pencerenin yapışmasını sağlamak için linker komut satırında / SUBSYSTEM: CONSOLE olmalıdır. Belgeler main, tanımlanmışsa bunun varsayılan olduğunu söylüyor , ancak komut satırında açıkça ayarlamazsam, uygulama çıktığında VS pencereyi öldürür.
çekiyor

2
@James: bir konsol penceresi almak için bu gereklidir. Bu da başka bir yol değil, WinMain () yerine main () gerektirir. Biraz kayboldum ...
Hans Passant

4
@nobugz: "Win32 Konsol Uygulaması" yerine "Boş bir Projeden" başlarsanız, alt sistem proje özelliklerinde açıkça ayarlanmaz. mainProjede tanımlarsanız , bağlayıcı varsayılan olarak CONSOLE alt sistemini kullanır. Hata ayıklama veya çalıştırma sırasında bir konsol penceresi göreceksiniz. Ancak, proje özelliklerinde alt sistem olarak açıkça CONSOLE belirtmezseniz, Visual Studio konsol penceresini açık tutmaz. Her zaman boş bir projeden başlıyorum ve nadiren bireysel proje özelliklerini değiştiriyorum, bu yüzden konsol penceresinin yapıştığını hiç görmedim. Karışıklık için üzgünüm
James McNellis

9

Kodunuzun bitiminden önce bu satırı ekleyin:

system("pause");

Bu, bir tuşa basana kadar konsolu koruyacaktır.

#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
}

Ayrıca "Devam etmek için herhangi bir tuşa basın." benim için.
PapaHotelPapa

8

cin.get();2 kez arayın :

    //...
    cin.get();
    cin.get();
    return 0
}

6
ama neden iki kez ??
Madhawa Priyashantha

örneğin bundan önce dizi içinde bir dize almak için başka bir cin.get () yöntemine ihtiyacımız olursa ne olur? Bu senaryoda işe yaramıyor.
QMaster

4

Kodunuzu Code :: Blocks gibi yetkili bir IDE'den çalıştırırsanız , IDE kodu çalıştırmak için kullandığı konsolu yönetir ve uygulama kapandığında açık tutar. Konsolu açık tutmak için özel kod eklemek istemezsiniz, çünkü bu IDE'nin dışında gerçek olarak kullandığınızda düzgün çalışmasını engeller.


3

Tamam, sanırım Visual Studio kullanarak Windows'tasınız ... neden? Çünkü bir çeşit Linux işletim sistemindeyseniz, muhtemelen konsoldan çalıştırıyorsunuzdur.

Her neyse, başkalarının önerdiği gibi programınızın sonuna bok ekleyebilirsiniz veya CTRL + F5'e (hata ayıklamadan başla) basabilirsiniz ve Visual Studio konsolu tamamladıktan sonra bırakacaktır.

Hata ayıklama sürümünü çalıştırmak ve kodunuza bok eklemek istemiyorsanız başka bir seçenek de konsol penceresini (Başlat -> Çalıştır -> cmd) açmak ve Hata Ayıklama çıktı dizininize gitmek . Ardından, çalıştırılabilir dosyanızın adını girin ve bu hata ayıklama programınızı konsolda çalıştıracaktır. Daha sonra gerçekten isterseniz Visual Studio'nun ekini işlemek için kullanabilirsiniz.


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

using namespace std;

int main()
{

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

    return 0;
}

Kimse bu yazı burada fark etmedi.


Bu conio.h, Windows'a özgü bir başlık olduğunu ve her makinede bulunmayabileceğini ekleyebilirim (veya ayrı bir bağlantıya ihtiyacınız olabilir, bu da bir aşırıya kaçmadır).
Yksisarvinen

Çalışma. getch () değiştirmek için sadece gerekli; to _getch (); kullanımdan kaldırıldığından beri
ncesar

2

Uygulamanız Visual C ++ ile gerçekten hata ayıklama yapıyorsanız, F5 tuşuna veya araç çubuğundaki yeşil üçgene basın. Gerçekten hata ayıklamıyorsanız (ayarlanmış kesme noktası yoksa), Ctrl + F5 tuşlarına basın veya menülerde Hata Ayıklamadan Başlat'ı seçin (genellikle kafa karıştırıcı olduğunu kabul ettiğim Hata Ayıklama menüsünde.) Biraz daha hızlı olacak, ve daha da önemlisi, kodunuzu değiştirmek zorunda kalmadan sonunda duracaktır.

Alternatif olarak, bir komut istemi açın, exe'nizin bulunduğu klasöre gidin ve adını yazarak çalıştırın. Bu şekilde, komut istemini çalıştırmayı bitirdiğinizde kapanmaz ve çıktıyı görebilirsiniz. Bu yöntemlerin her ikisini de, uygulamayı bittiği gibi durduran kod eklemeye tercih ederim.


2

Programınızın sonuna aşağıdakileri eklemeniz yeterlidir. Bir tür kullanıcı girişi yakalamaya çalışacak ve böylece konsolun otomatik olarak kapanmasını durduracaktır.

cin.get();

2

Herhangi önce aşağıdaki satırları ekleyin exit()işlevi veya herhangi önce returnde s main():

std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");

Bu benim için işe yaramıyor, ilk satır çalışıyor ancak enter tuşuna basmak hiçbir şey yapmıyor
Qwertie

2

Visual Studio (ve yalnızca Visual Studio) için aşağıdaki kod snippet'i , önce giriş arabelleğini temizleyerek kullanıcının yeni bir tuşa açıkça basmasını gerçekten bekleyen bir 'tuşa basmanın devam etmesini bekleyin' istemi verir :

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

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

Bunun, tchar.hmakroyu birden çok 'karakter kümesiyle' uyumlu olmak için kullandığını unutmayın (VC ++ bunları çağırdığında).


2

Sadece bunu yapıyorum:

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

Not: cin arabelleğini ve benzerlerini temizlemek yalnızca cin'i programınızın daha önceki bir noktasında kullandıysanız gereklidir. Ayrıca std :: numeric_limits :: max () kullanmak muhtemelen INT_MAX'dan daha iyidir, ancak biraz gariptir ve genellikle gereksizdir.


İşe yarıyor ama dönüş 0; Bu kodu kullanırsam yürütülmez.
wernersbacher

2

Aşağıdaki kodu kullanın #include "stdafx.h"ve system("pause");aşağıdaki kodu kullanın .

#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");
}

systemiçinde ilan edildi <cstdlib>, değil stdafx.h.
melpomene

1

Yeh cevabına benzer bir fikir , sadece minimalist bir alternatif.

Aşağıdaki içeriğe sahip bir toplu iş dosyası oluşturun:

helloworld.exe
pause

Sonra toplu iş dosyasını kullanın.


1

basitçe

#include <cstdio>

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

bazı nedenlerden dolayı, bir programı çalıştırdığınızda genellikle stdin'de getchar ile okumak için genellikle 1 karakter vardır. böylece ilk getchar bu karakteri okur ve ikinci getchar programdan çıkmadan önce kullanıcı (sizin) girişinizi bekler. Ve bir program çoğu terminalden çıktıktan sonra, özellikle Windows kapat terminalinde hemen. bu yüzden hedeflediğimiz şey, bir programın her şeyi çıkardıktan sonra bitirmesini önlemenin basit bir yoludur. Tabii ki bunu çözmek için daha karmaşık ve temiz yollar var, ama bu en basit olanı.


2
Lütfen bunun neden sorunu çözdüğüne dair en az kısa bir açıklama ekleyin.
kaya3

0

Program sona erdikten sonra pencereyi açık tutmak için IDE'nizin proje ayarında bir onay kutusunun olup olmadığına bakın. Değilse std::cin.get();, ana işlevin sonundaki bir karakteri okumak için kullanın . Ancak, yalnızca satır tabanlı giriş (std :: getline) kullandığınızdan veya kalan okunmamış karakterlerle (aksi halde std :: yeni satıra kadar yoksayın) uğraştığınızdan emin olun, aksi takdirde sondaki .get () yalnızca bıraktığınız çöpleri okuyacaktır. daha önce okunmamış.


0

Bu iyi çalışıyor gibi görünüyor:

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

Öncelikle arabelleği temizlerseniz, bir sonrakini okuduğunuzda sorun olmaz. Bazı nedenlerden dolayı cin.ignore(1)çalışmaz, 2 olması gerekir.


1
2 bazen de yeterli olmaz (sırada daha fazla tuş vuruşu olduğunda). Doğru yol sıradaki kadar karakteri yok saymaktır. İle cin.rdbuf()->in_avail,. 1 veya 2 gibi sihirli bir sayı değil
Konrad Rudolph

0

Her zaman bir toplu iş dosyası oluşturabilirsiniz. Örneğin, programınıza helloworld.exe adı verilirse, bazı kodlar şöyle olur:

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

0

Windows kullanıyorsanız, system("pause >nul");veya yapabilirsiniz system("pause");. Siz bir tuşa basana kadar programı duraklatmak için bir konsol komutu yürütür. >nulsöylemesini engeller Press any key to continue....


0

Programın son dönüşünde bir kesme noktası koyuyorum. İyi çalışıyor.


1
Bu soruya bir cevap vermez. Bir yazarın eleştirisini yapmak veya açıklama istemek için yazılarının altına bir yorum bırakın - her zaman kendi yayınlarınıza yorum yapabilirsiniz ve yeterli bir üne sahip olduğunuzda herhangi bir yazı hakkında yorum yapabilirsiniz .
Ravi Dhoriya ツ

1
Bu nasıl cevap vermiyor? Bir sorunun yazarı gibi tamamen aynı durumdayım ve bu yardımcı olur.
lierosk

0

Ben kullandım cin.get()ve bu çalıştı ama bir gün cin.get([Array Variable])ortasında boş karakteri olan bir ling dize kapmak için daha önce başka bir kullanmak gerekiyordu . bu yüzden cin.get()komut istemi penceresinin kapanmasını engellemedi. Sonunda başka bir yol buldum: Harici bir pencerede açmak için CTRL + F5 tuşlarına basın ve Visual Studio artık üzerinde denetime sahip değil. Sadece son komutlar çalıştırıldıktan sonra kapanmayı soracaksınız.


0

getchar()Sonunda bir işlev koymaya çalıştım . Ama işe yaramadı. Yaptığım şey, getchar()birbiri ardına iki işlev eklemekti . Sanırım ilk veri, son veri girişinden sonra bastığınız tuşu getchar()emiyor Enter. Bu yüzden bir getchar()yerine iki işlev eklemeyi deneyin


0

Çalıştır düğmesine basmak yerine, CTRL ve F5 tuşlarına aynı anda basın, mesajı sürdürmek için herhangi bir tuşa basmanızı sağlar. Ya da "(uyarı, antivirüslerden hoşlanmadığı için gerçek programları test etmek için bunu kullanın !!!!)" yazın, ancak: (uyarı, bunu yalnızca antivirüs don olarak değil gerçek programları test etmek için kullanın beğenmedim !!!!)


0

0 döndürmeden hemen önce cin.ignore () kullanın; iki defa

main()
  {
  //your codes 

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

  return 0;
  }

bu kadar


Normalde böyle bir şey yaparım. cin.ignore (); cin.get ();
aj.toulan

-1

Yapmanız gereken tek şey x için bir değişken ayarlamak sonra 0 döndürmeden önce bunu yazın;

cout<<"\nPress any key and hit enter to end...";
cin>>x;

-1

Hatta bir tamsayı main()işlevinizin başında bildirebilir (diyelim int a;) ve std::cin >> a;dönüş değerinin hemen önüne koyabilirsiniz . Böylece bir tuşa basıp girene kadar program çalışmaya devam eder.

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.