Zapobieganie zamykaniu okna konsoli w aplikacji konsoli Visual Studio C / C ++


464

Jest to prawdopodobnie kłopotliwe pytanie, ponieważ bez wątpienia odpowiedź jest oślepiająco oczywista.

Korzystam z programu Visual Studio od lat, ale po raz pierwszy opracowałem aplikację konsolową.

Po uruchomieniu aplikacji pojawia się okno konsoli, pojawia się wynik programu, a następnie okno zamyka się wraz z zamykaniem aplikacji.

Czy istnieje sposób, aby pozostawić je otwarte, dopóki nie sprawdzę danych wyjściowych, lub wyświetlić wyniki po zamknięciu okna?


Monodevelop robi to, czego oczekujesz.
ctrl-alt-delor

3
Poniżej znajduje się zbyt wiele odpowiedzi, więc skopiuję odpowiedź tutaj: jeśli używasz VS2017, to Narzędzia-> Opcje-> Debugowanie-> Automatycznie zamknij konsolę
jw_

Zgoda. Myślę, że najlepszą odpowiedzią na VS 2017 i nowszą jest ta chronoxor.
Wszystkie Rage

Odpowiedzi:


466

Jeśli uruchamiasz bez debugowania (Ctrl + F5), domyślnie wyświetla monit o naciśnięcie klawisza Return, aby zamknąć okno. Jeśli chcesz użyć debugera, powinieneś umieścić punkt przerwania w ostatniej linii.


268
Jeśli masz aplikację C ++ i uruchom bez debugowania, a okno konsoli nadal się zamyka, musisz pamiętać, aby jawnie ustawić Podsystem na Konsolę w obszarze Właściwości konfiguracji / Linker / System. Może się to zdarzyć, jeśli zaczniesz od pustego projektu, który pozostawia Podsystem nieuzbrojony.
Trevor Robinson

4
Nie działało dla mnie :( Okno konsoli otwiera się i zamyka natychmiast, ale dziennik zatrzymuje się i czeka na dodatkowe naciśnięcie F5
CodyBugstein

40
Prawidłowa odpowiedź to odpowiedź @TrevorRobinson: Oto wersja rozszerzona, jeśli masz problemy ze znalezieniem właściwości konfiguracji: Kliknij prawym przyciskiem myszy projekt w Visual Studio> Właściwości> Właściwości konfiguracji> Linker> System, zmień Podsystem na „ Console ”
PlagueHammer

3
Trevor Robinson ma rację. Jeśli rozpoczniesz pusty projekt i pozycję C ++. Musisz przejść do Widok-> Menedżer właściwości-> Właściwość (ikona klucza) -> Konfiguracja. Właściwości-> Linker-> System-> Podsystem-> z menu podręcznego wybierz Konsola.
najbardziej czcigodny sir

10
Pracuję nad społecznością VS 2017. ctrl+f5nie działa, nie ma Propertieskiedy klikam prawym przyciskiem myszy projekt, również wrench iconjest wyszarzony.
Ketan

232

Kliknij projekt prawym przyciskiem myszy

Właściwości> Właściwości konfiguracji> Linker> System

Wybierz opcję Konsola (/ PODSYSTEM: KONSOLA) w SubSystemopcji lub możesz po prostu wpisać Konsolę w polu tekstowym!

Teraz spróbuj ... powinno działać


To zadziałało w przypadku mojego VS2013 Express, ale zaakceptowana odpowiedź nie. Bardzo dziwne, ponieważ zaakceptowana odpowiedź działała dla wszystkich wersji Visual Studio, z których korzystałem w przeszłości.
Michael Calvin

9
@MichaelCalvin Musisz ustawić Ctrl + F5 po ustawieniu tego, to jest kicker.
Jonathan Mee,

@JonathanMee stwierdził, że nadal masz Ctrl + F5. Było to już ustawione w moim studiu wizualnym 2015, więc pierwszą odpowiedzią była ta, która najbardziej pomogła.

To jest rzeczywiście poprawne. Znajomy CTRL+F5zawiedzie, jeśli, powiedzmy, dodasz nowy plik C ++ do pustego projektu.
user2023370

Pracowałem dla mnie nad Visual Studio Express 2015. Dzięki.
LHC

44

Oto sposób na C / C ++:

#include <stdlib.h>

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

Umieść to na górze programu, a JEŚLI jest on w systemie Windows ( #ifdef _WIN32), wówczas utworzy makro o nazwie WINPAUSE. Ilekroć chcesz, aby Twój program wstrzymał się, zadzwoń, WINPAUSE;a program wstrzyma program za pomocą polecenia DOS. W przypadku innych systemów, takich jak Unix / Linux, konsola i tak nie powinna wyjść z wyjścia programu.


Ta metoda nie działa w Visual C ++ (chyba że podasz jakiś nagłówek?)
wmac

2
@wmac Musisz dołączyć nagłówek windows.h
Geowil

1
Nie podałem żadnej biblioteki ani przestrzeni nazw, ale działa ona poprawnie, wielkie dzięki.
Halil İbrahim Oymacı

1
Proszę nie rób tego. pauseKomenda jest specyficzne dla systemu Windows.
firegurafiku 30.09.16

Pracował dla mnie w Visual Studio 2013 Express. :)
Anirban,

32

Idź do menu debugowania-> Naciśnij Start bez bez debugowania


Nie jest to nawet opcja w VS 2008, chyba że wybrano środowisko programistyczne C #. CTRL + F5 działa jednak. Możesz również dodać to jako przycisk do paska narzędzi poprzez Narzędzia> Dostosuj.
perry,

Jeśli masz wiele projektów, ustaw odpowiedni jako projekt startowy
CAD bloke

27

Jeśli korzystasz z .NET, umieść go Console.ReadLine()przed końcem programu.

Będzie czekać <ENTER>.


9
+1 - Albo to, albo Console.ReadKey()po prostu poczekaj na dowolny klucz.
Fredrik Mörk

Dziwne, to nie ma wpływu na moją aplikację. Nadal zamyka się bez oczekiwania na dane wejściowe użytkownika.
Kokodoko

4
Twój kod najprawdopodobniej kończy pracę, zanim osiągnie ten punkt.
Rzeczywiście,

20

Począwszy od Visual Studio 2017 (15.9.4) istnieje opcja:

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

Odpowiedni fragment z dokumentacji Visual Studio :

Automatycznie zamknij konsolę po zatrzymaniu debugowania:

Informuje program Visual Studio o zamknięciu konsoli pod koniec sesji debugowania.


2
Właśnie przetestowałem to w VS2017 i VS2019. Wymaga to zarówno ustawienia podsystemu na KONSOLA, jak i wyłączenia tej opcji. Posiadanie jednego lub drugiego lub żadne z nich automatycznie nie zamyka okna.
Casey

To wciąż zamyka okno, jeśli uruchamiam wiele projektów z tego samego rozwiązania.
Serge Rogatch,

Wydaje mi się, że to właściwa odpowiedź na VS 2017 i kolejne. Szkoda, że ​​nie ma go w starszych wersjach.
Wszystkie Rage

13

spróbuj zadzwonić getchar()tuż przed main()powrotem.


Nie działa w VS 2008 dla prostej aplikacji konsoli Hello Name. cout, cin, cout, getchar (), konsola wciąż się zamyka. O co chodzi?
perry,

1
Spróbuj wstawić getchar () dwa razy, jeśli masz cout tuż przed getchar (). getchar () oczekuje znaku, a ty już dajesz go z cout ... Daj mi znać, jeśli to pomoże :)
Magarusu

12

(/ SUBSYSTEM: CONSOLE) nie działał na moim vs2013 (już go miałem).

„Uruchom bez debugowania” nie jest opcją, ponieważ nie chcę przełączać się między debugowaniem a wyświetlaniem danych wyjściowych.

Skończyłem z

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

Rozwiązanie zastosowane w qtcreator w wersji 2.6. Teraz, gdy qt rośnie, vs idzie w drugą stronę. Jak pamiętam, w vs2008 nie potrzebowaliśmy takich sztuczek.


7

Oto rozwiązanie, które (1) nie wymaga żadnych zmian kodu ani punktów przerwania, a (2) zatrzymuje się po zakończeniu programu , aby zobaczyć wszystko , co zostało wydrukowane. Zatrzyma się po naciśnięciu F5 lub Ctrl + F5. Główną wadą jest to, że w VS2013 Express (zgodnie z testami) nie ładuje symboli, więc debugowanie jest bardzo ograniczone.

  1. Utwórz plik wsadowy. Zadzwoniłem do mojego runthenpause.bat, o następującej treści:

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

    Pierwszy wiersz uruchomi dowolne podane polecenie i maksymalnie osiem argumentów. Druga linia ... pauza.

  2. Otwórz właściwości projektu | Właściwości konfiguracji | Debugowanie

  3. Zmień „Argumenty poleceń” na $(TargetPath)(lub cokolwiek w „Poleceniu”).
  4. Zmień „Polecenie” na pełną ścieżkę do runthenpause.bat.
  5. Kliknij OK.

Teraz, po uruchomieniu, runthenpause.baturuchomi aplikację, a po jej zakończeniu zatrzyma się, aby zobaczyć dane wyjściowe konsoli.

Opublikuję aktualizację, jeśli wymyślę, jak załadować symbole. Próbowałem /Z7za to , ale bez powodzenia.


1
To wciąż nie obsługuje debugowania, ale przynajmniej rozwiązuje problem braku możliwości zobaczenia wyniku np. VLD, w przeciwieństwie do wszystkich innych odpowiedzi.
Martin Hennings


3

Możesz uruchomić swój plik wykonywalny z wiersza polecenia. W ten sposób możesz zobaczyć wszystkie dane wyjściowe. Lub możesz zrobić coś takiego:

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

return YOUR_MAIN_CODE;

i w ten sposób okno nie zamknie się, dopóki nie wprowadzisz danych dla azmiennej.


3

dodaj „| pause ”w polu argumentów poleceń w sekcji debugowania we właściwościach projektu.


4
Byłoby to świetne rozwiązanie, gdyby zadziałało. pausewydaje się działać tylko w plikach wsadowych i chociaż odbiera dane wejściowe z programu na STDIN, nie drukuje ponownie tego tekstu. Próbowałem zastępując |z &&, ale to nie miało żadnego wpływu - prawdopodobnie dlatego, że nie jest wykonywany z powłoki poleceń (cmd.exe).
Brian Vandenberg,

3

Wystarczy nacisnąć CNTRL + F5, aby otworzyć go w oknie zewnętrznego wiersza poleceń (Visual Studio nie ma nad nim kontroli).

Jeśli to nie zadziała, dodaj następujący kod na końcu kodu:

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

Poczekaj, aż naciśniesz klawisz, aby zamknąć okno terminala, gdy kod osiągnie koniec.

Jeśli chcesz to zrobić w wielu miejscach, umieść powyższy kod w metodzie (np. private void Pause()) I wywołaj, Pause()gdy program osiągnie możliwy koniec.


kiedy robię cntrl + f5, otwiera, a następnie zamyka natychmiast? jak to naprawić?
Callat

Drugie rozwiązanie było tym, czego szukałem!
RoG

Kiedy nacisnę Ctrl + F5, nic się nie dzieje. Kiedyś działało dla mnie, ale nagle przestało działać.
Natasha

2

Nieco lepsze rozwiązanie:

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

na początku twojego programu.

Plusy:

  • można użyć std :: exit ()
  • może mieć wiele zwrotów z głównego
  • możesz uruchomić swój program w debuggerze
  • Niezależny od IDE (niezależny od systemu operacyjnego, jeśli używasz cin.sync(); cin.ignore();lewy zamiast system("pause");)

Cons:

  • muszę zmodyfikować kod
  • nie zatrzyma się na std :: terminate ()
  • nadal będzie występować w twoim programie poza sesją IDE / debugger; możesz temu zapobiec w systemie Windows, używając:

extern "C" int __stdcall IsDebuggerPresent(void);
int main(int argc, char** argv) {
    if (IsDebuggerPresent())
        atexit([] {system("PAUSE"); });
    ...
}

Bardzo zła rada.
Pozdrawiam i hth. - Alf

Czy potrafisz wyjaśnić, dlaczego?
GhassanPL,

W przypadku, gdy się nie debuguje, nie robi nic pożytecznego, ponieważ w tym przypadku nie ma problemu do rozwiązania. W VS wystarczy uruchomić program z Ctrl + F5 i to wszystko, więc nie ma problemu w VS, a w interpretera poleceń nie ma problemu, krótko mówiąc, nie ma problemu. A w przypadku, gdy ktoś debuguje i chce zatrzymać kod dodany do zatrzymania, nie jest to wygodniejsze rozwiązanie niż punkt przerwania i przeszkadza w sytuacjach, w których nie chce się zatrzymywać.
Pozdrawiam i hth. - Alf

2

Albo użyj:

  1. cin.get();

lub

  1. system("pause");

Pamiętaj, aby wykonać jedną z nich na końcu main()funkcji i przed returninstrukcją.


2

Możesz także użyć tej opcji

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

2

W moim przypadku tego doświadczyłem, gdy utworzyłem projekt Empty C ++ w wydaniu społeczności VS 2017. Musisz ustawić podsystem na „Console (/ SUBSYSTEM: CONSOLE)” w obszarze Właściwości konfiguracji.

  1. Przejdź do „Widok”, a następnie wybierz „Menedżer nieruchomości”
  2. Kliknij prawym przyciskiem myszy projekt / rozwiązanie i wybierz „Właściwość”. Spowoduje to otwarcie strony właściwości Test
  3. Przejdź do linkera, a następnie wybierz „System”
  4. Kliknij „Podsystem” i pojawi się menu rozwijane
  5. Wybierz „Console (/ SUBSYSTEM: CONSOLE)”
  6. Zastosuj i zapisz
  7. Następnym razem, gdy uruchomisz kod za pomocą „CTRL + F5”, powinieneś zobaczyć wynik.

0

Visual Studio 2015 z importami . Ponieważ nienawidzę, gdy przykłady kodu nie dają potrzebnego importu.

#include <iostream>;

int main()
{
    getchar();
    return 0;
}

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.