Ostatnio próbowałem nauczyć się C ++ z tej strony . Niestety, ilekroć próbuję uruchomić jeden z przykładów kodu, widzę, że ten program jest otwarty na około pół sekundy, a następnie natychmiast się zamyka. Czy jest jakiś sposób, aby zatrzymać natychmiastowe zamykanie programu, abym mógł zobaczyć owoce mojego wysiłku?
193
Odpowiedzi:
Edycja: Jak słusznie zauważa Charles Bailey w komentarzu poniżej, nie zadziała to, jeśli buforowane są postacie
stdin
i naprawdę nie ma dobrego sposobu na obejście tego. Jeśli korzystasz z podłączonego debugera, sugerowane rozwiązanie Johna Diblinga jest prawdopodobnie najczystszym rozwiązaniem twojego problemu.Powiedziawszy, zostawię to tutaj i może ktoś inny uzna to za przydatne. Używałem go często jako szybkiego hacka podczas pisania testów podczas programowania.
Po zakończeniu
main
funkcji możesz zadzwonićstd::getchar();
Otrzyma to pojedynczy znak
stdin
, co da ci zachowanie „naciśnij dowolny klawisz, aby kontynuować” (jeśli naprawdę chcesz otrzymać komunikat „naciśnij dowolny klawisz”, musisz sam go wydrukować).Trzeba
#include <cstdio>
zagetchar
.źródło
getchar
nie rozwiązuje problemu - przynajmniej w ograniczonych okolicznościach. Odczytuje znak zstdin
, ale jeśli są już znaki buforowane ze standardowego wejścia, program będzie kontynuował bez czekania, niezależnie od tego, czy wydrukujesz monit, czy nie.\n
jest częściowym rozwiązaniem, ale nie pomoże, jeśli buforowany jest więcej niż jeden wiersz danych wejściowych. Nie znam standardowego sposobu C ++, aby wyczyścić wszystko ze strumienia wejściowego. : - /std::cin.ignore(std::cin.rdbuf()->in_avail());
? Mam to stąd .std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
z#include <limits>
.Jeśli używasz Visual Studio i uruchamiasz aplikację konsolową z IDE:
naciśnięcie CTRL-F5 (uruchom bez debugowania) uruchomi aplikację i pozostanie otwarte okno konsoli, dopóki nie naciśniesz żadnego klawisza.
źródło
Rozwiązanie Jamesa działa na wszystkich platformach.
Alternatywnie
Windows
możesz także dodać następujące przed powrotem zmain
funkcji:Spowoduje to uruchomienie
pause
polecenia czekającego na naciśnięcie klawisza, a także wyświetlenie miłej wiadomościPress any key to continue . . .
źródło
Jeśli używasz programu Microsoft Visual C ++ 2010 Express i napotykasz problem z tym, że CTRL + F5 nie działa w celu utrzymania konsoli otwartej po zakończeniu programu, spójrz na ten wątek MSDN .
Prawdopodobnie IDE jest skonfigurowane do zamykania konsoli po uruchomieniu CTRL + F5; w rzeczywistości „Pusty projekt” w Visual C ++ 2010 domyślnie zamyka konsolę. Aby to zmienić, wykonaj czynności sugerowane przez moderatora Microsoft:
źródło
Zazwyczaj po prostu stawiam punkt przerwania na
main()
zamykającym się nawiasie klamrowym. Kiedy koniec programu zostanie osiągnięty w jakikolwiek sposób, punkt przerwania uderzy i możesz ALT-Tab w oknie konsoli, aby wyświetlić wynik.źródło
Dlaczego po prostu nie uruchomić programu z konsoli, tj. Uruchomić program z cmd.exe, jeśli używasz systemu Windows. W ten sposób okno pozostaje otwarte po zakończeniu programu.
[EDYCJA]: Kiedy używam KDevelop4, istnieje pełnoprawna instancja Bash (Linux CLI) działająca na zakładce na dole IDE. Tego używam w takich okolicznościach.
źródło
main
jest zdefiniowane, ale jeśli nie ustawię go jawnie w wierszu poleceń, VS zabija okno po zamknięciu aplikacji. westchnieniemain
w projekcie, konsolidator domyślnie korzysta z podsystemu CONSOLE. Podczas debugowania lub uruchamiania pojawi się okno konsoli. Jednakże, chyba że wyraźnie podasz CONSOLE jako podsystem we właściwościach projektu, Visual Studio nie utrzyma otwartego okna konsoli. Zawsze zaczynam od pustego projektu i rzadko zmieniam właściwości poszczególnych projektów, więc nigdy nie widziałem, żeby okno konsoli się zatrzymało. Przepraszamy za zamieszaniePrzed końcem kodu wstaw następujący wiersz:
Pozwoli to zachować konsolę do momentu naciśnięcia klawisza.
źródło
Zadzwoń
cin.get();
2 razy:źródło
Jeśli uruchomisz kod z kompetentnego IDE, takiego jak Code :: Blocks , IDE będzie zarządzać konsolą używaną do uruchamiania kodu, pozostawiając go otwartym po zamknięciu aplikacji. Nie chcesz dodawać specjalnego kodu, aby utrzymać konsolę otwartą, ponieważ uniemożliwi to jej poprawne działanie, gdy będziesz używać jej naprawdę poza IDE.
źródło
Okej, zgaduję, że korzystasz z systemu Windows za pomocą programu Visual Studio ... dlaczego? Cóż, ponieważ jeśli masz system operacyjny Linux, prawdopodobnie uruchomiłbyś go z konsoli.
W każdym razie możesz dodać bzdury na koniec programu, jak sugerują inni, lub możesz po prostu nacisnąć CTRL + F5 (zacznij bez debugowania), a Visual Studio opuści konsolę po zakończeniu.
Inną opcją, jeśli chcesz uruchomić wersję Debugowania i nie dodawać bzdur do kodu, jest otwarcie okna konsoli (Start -> Uruchom -> cmd) i przejście do katalogu wyjściowego Debugowania . Następnie wystarczy wpisać nazwę pliku wykonywalnego, aby uruchomić program do debugowania w konsoli. Następnie możesz użyć programu Visual Studio do dołączania do przetwarzania lub czegoś takiego, jeśli naprawdę chcesz.
źródło
Nie zauważyłem, że ktoś to opublikował, więc oto jest.
źródło
conio.h
jest to nagłówek specyficzny dla systemu Windows i może nie być dostępny na każdym komputerze (lub być może trzeba go połączyć osobno, co jest przesadą).Jeśli faktycznie debugujesz aplikację w Visual C ++, naciśnij klawisz F5 lub zielony trójkąt na pasku narzędzi. Jeśli tak naprawdę nie debugujesz go (nie masz ustawionych punktów przerwania), naciśnij Ctrl + F5 lub wybierz z menu opcję Rozpocznij bez debugowania (zwykle jest to menu Debugowanie, które, jak się zgadzam, jest mylące). Będzie trochę szybciej, i co ważniejsze dla ciebie, zatrzyma się na końcu bez konieczności zmiany kodu.
Możesz też otworzyć wiersz polecenia, przejść do folderu, w którym znajduje się plik exe, i uruchomić go, wpisując jego nazwę. W ten sposób po zakończeniu uruchamiania wiersz polecenia nie zamyka się i można wyświetlić wynik. Wolę obie te metody od dodania kodu, który zatrzymuje aplikację po zakończeniu.
źródło
Po prostu dodaj poniższe na końcu programu. Spróbuje przechwycić jakąś formę danych wejściowych użytkownika, dzięki czemu konsola nie zostanie automatycznie zamknięta.
źródło
Dodaj następujące wiersze przed dowolną
exit()
funkcją lub przed dowolnymreturn
wmain()
:źródło
W przypadku programu Visual Studio (i tylko Visual Studio) następujący fragment kodu wyświetla monit o „poczekanie na naciśnięcie klawisza, aby kontynuować”, który naprawdę czeka na wyraźne naciśnięcie nowego klawisza przez użytkownika, najpierw opróżniając bufor wejściowy:
Zauważ, że dzięki temu
tchar.h
makra są kompatybilne z wieloma „zestawami znaków” (jak je nazywa VC ++).źródło
Po prostu to robię:
Uwaga: wyczyszczenie bufora cin i takie jest konieczne tylko wtedy, gdy użyłeś cin w pewnym momencie wcześniej w swoim programie. Również użycie std :: numeric_limits :: max () jest prawdopodobnie lepsze niż INT_MAX, ale jest nieco nieporadne i zwykle niepotrzebne.
źródło
Użyj
#include "stdafx.h"
isystem("pause");
tak jak kod poniżej.źródło
system
jest zadeklarowany w<cstdlib>
, niestdafx.h
.Podobny pomysł Yeh odpowiedź, tylko minimalistyczny alternatywą.
Utwórz plik wsadowy o następującej treści:
Następnie użyj pliku wsadowego.
źródło
po prostu
z jakiegoś powodu zwykle jest możliwe odczytanie 1 znaku za pomocą getchar już w standardowym czasie uruchamiania programu. więc pierwszy getchar odczytuje ten znak, a drugi getchar czeka na dane wejściowe użytkownika (twojego) przed wyjściem z programu. A po wyjściu programu z większości terminali, szczególnie w systemie Windows natychmiast zamknij terminal. dlatego naszym celem jest prosty sposób zapobiegania zakończeniu programu po wypisaniu wszystkiego. Oczywiście istnieją bardziej złożone i czyste sposoby rozwiązania tego, ale jest to najprostszy.
źródło
Sprawdź, czy IDE ma pole wyboru w ustawieniach projektu, aby okno pozostało otwarte po zakończeniu programu. Jeśli nie, użyj,
std::cin.get();
aby odczytać znak na końcu głównej funkcji. Pamiętaj jednak, aby używać wyłącznie wprowadzania liniowego (std :: getline) lub w przeciwnym razie radzić sobie z pozostałymi nieprzeczytanymi znakami (std :: ignoruj do nowej linii), ponieważ w przeciwnym razie .get () na końcu odczyta tylko śmieci, które pozostawiłeś nieprzeczytane wcześniej.źródło
To wydaje się działać dobrze:
Jeśli najpierw wyczyścisz bufor, nie będzie problemu podczas czytania następnego. Z jakiegoś powodu
cin.ignore(1)
nie działa, musi być 2.źródło
cin.rdbuf()->in_avail
,. Żadna magiczna liczba jak 1 lub 2.Zawsze możesz po prostu utworzyć plik wsadowy. Na przykład, jeśli Twój program nazywa się helloworld.exe, kod może wyglądać następująco:
źródło
Jeśli używasz systemu Windows, możesz zrobić
system("pause >nul");
lubsystem("pause");
. Wykonuje polecenie konsoli, aby wstrzymać program do momentu naciśnięcia klawisza.>nul
zapobiega temuPress any key to continue...
.źródło
Stawiam punkt przerwania przy ostatnim zwrocie 0 programu. To działa dobrze.
źródło
Użyłem
cin.get()
i to działa, ale pewnego dnia musiałem użyć innegocin.get([Array Variable])
, aby złapać sznur molwy z pustym znakiem na środku. więccin.get()
nie uniknęło zamknięcia okna wiersza polecenia. Wreszcie znalazłem inny sposób: naciśnij CTRL + F5, aby otworzyć w oknie zewnętrznym, a Visual Studio nie ma już nad nim kontroli. Poprosi Cię tylko o zamknięcie po uruchomieniu ostatecznych poleceń.źródło
Próbowałem umieścić
getchar()
funkcję na końcu. Ale to nie zadziałało. Więc dodałem dwiegetchar()
funkcje jedna po drugiej. Myślę, że pierwszygetchar()
wchłania Enterklawisz, który naciskasz po ostatnim wprowadzeniu danych. Spróbuj więc dodać dwiegetchar()
funkcje zamiast jednejźródło
Zamiast naciskać przycisk Uruchom, naciśnij jednocześnie CTRL i F5, da ci to dowolny klawisz, aby kontynuować wiadomość. Lub wpisz „(ostrzeżenie użyj tego tylko do testowania nie rzeczywistych programów, ponieważ antywirusy tego nie lubią !!!!)” na końcu swojej głównej funkcji, ale: (ostrzeżenie użyj tego tylko do testowania nie rzeczywistych programów jako antywirusów to ci się podoba !!!!)
źródło
po prostu użyj cin.ignore () tuż przed zwróceniem 0; dwa razy
to wszystko
źródło
Wszystko, co musisz zrobić, to ustawić zmienną dla x, a następnie po prostu wpisać ją przed wartością 0;
źródło
Możesz nawet zadeklarować liczbę całkowitą na początku swojej
main()
funkcji (powiedzmyint a;
) i umieścićstd::cin >> a;
tuż przed wartością zwracaną. Tak więc program będzie działał, dopóki nie naciśniesz klawisza i nie wprowadzisz.źródło