2009-07-23 10 views
15

Po kompilacji programów konsoli okno konsoli zamyka się natychmiast po uruchomieniu. Jaka jest najlepsza praktyka, aby ją otworzyć? Szukałem ładunków Google, jestem przyzwyczajony do bloków kodu, w których nie musisz się martwić, ale chcę trochę pomieszać z Visual Studio i przy VS, moja konsola się zamyka. W całej interwebzie istnieje kilka różnych sposobów, aby go otworzyć, jednak przeczytałem, że większość z nich to złe techniki kodowania. Co to jest preferowana metoda Everyones?Jakie są najlepsze praktyki w zwalczaniu problemu zamknięcia konsoli?

Odpowiedz

5

cin jest rażąco nieeleganckie, ale łatwe dla zapominalskich czerpać:

{ 
    char c; 
    std::cin >> c; 
} 

To trzyma otwarte okno aż wpisywania znaków/* edit */i nacisnąć enter.

std::cin.get() zamknie okno z chwilą wpisania znaku, co w zależności od tego, jak łatwo się przyzwyczaisz, prowadzi do nieznacznie większego ryzyka "okrzyki, szkoda, że ​​tego nie zamknąłem!" niż dwa naciśnięcia klawisza: operator>>(istream &).

Oba różnią się od system("pause") tym, że zwracają w dostępnym dla programu sposobie wartość wpisanego znaku, więc jeśli nieczęsto zdarza się, że jeden klud prowadzi do drugiego, można napisać instrukcję przełączania na podstawie tego, co wpisałeś na przykład (na przykład) natychmiastowe wyjście, zapisanie pewnych wartości do dziennika, ponowne uruchomienie itd.

+3

std :: cin.get() ma taki sam efekt i jest krótszy. –

+3

Przechowuje to okno, dopóki nie pojawi się znak. Który nie, dopóki bufor nie zostanie przepłukany (cin jest buforowany). Wymaga to więc od użytkownika naciśnięcia klawisza Enter (lub wpisania wielu znaków i wypełnienia bufora). –

+0

@ robson3.1415, @martin patrz edycja :-) –

2

Bardzo często wystarczy po prostu wpisać kod, aby odczytać klucz z konsoli po zamknięciu głównego kodu aplikacji . Klucz odczytywany jest po prostu wyrzucany, ale otwiera konsolę.

To nie jest ładne, niekoniecznie - ale często robię to zawijane w definicji debugowania, więc podczas debugowania konsola jest otwarta. Podczas wydawania zwykle nie działa w VS, a po uruchomieniu z wiersza poleceń nie stanowi to już problemu.

+0

Podoba mi się pomysł #define debugowania. zdecydowanie lepszy niż punkt przerwania. – AShelly

13

Ponieważ zawsze używasz debuggera, ustaw punkt przerwania na instrukcji return z main().

Debugger to Twój najlepszy przyjaciel, ucz się (i ucz się wcześniej), aby używać go na swoją korzyść przy każdej okazji.

+1

za każdym razem, gdy to robię, ciągle znajduję się w crt0.c, co jest naprawdę denerwujące. – AShelly

6

uruchomić program w konsoli, który byłby oczekiwany sposób działa program konsoli ...

Alternatywnie, można zrobić mały plik wsadowy do wykonania swój program, który miałby:

REM batch file to launch program 
yourprogram.exe 
PAUSE 

i polecenie cmd.exe o nazwie PAUSE poprosi użytkownika o naciśnięcie dowolnego klawisza.

+9

To całkiem proste. Kliknij prawym przyciskiem myszy swój projekt w VS, wybierz Właściwości. W sekcji debugowania można powiedzieć, aby uruchomić program zewnętrzny. W takim przypadku będzie to plik wsadowy, który uruchamia twoją aplikację. –

4

I mają tendencję do używania system("PAUSE"); co daje Ci wiadomość

Press any key to continue . . .

.

+1

To jest specyficzne dla systemu Windows, ale myślę, że to się robi. – DeusAduro

+0

Masz rację, że jest to tylko Windows, ale w Visual Studio uznałem, że jest to problem, więc uznałem, że to będzie w porządku .. – irh

+2

-1 Nie używaj wywołań systemowych do takich rzeczy jak – Patrick

0

wywołać tę funkcję przed powrotem na koniec główny:

void onEnd() 
{ 
    printf("Press any key to exit..."); 
    _getch(); 
} 
21

Kiedy używam Visual Studio i nie muszę debugowanie I wystarczy uruchomić go za pomocą Ctrl + klawiszy F5 – i zapobiega zamknięciu konsoli.

3

używam:

cin.get() 

usłyszałem to było mniej kosztowne niż systemu ("PAUSE") i działa na systemach POSIX też. Jest świetny link, który zawiera szczegółowe informacje na ten temat.

+4

Co kosztuje wszystko? Cały punkt kodu polega na tym, aby okno terminala było zawieszone do momentu naciśnięcia klawisza. Jak powolny jest twój "system" ("PAUSE") 'w porównaniu z np. Twój refleks ;-) –

3

Oprzeć się pokusie, aby cokolwiek zrobić. Dobrze zachowane programy wiersza poleceń kończą działanie po zakończeniu pracy, zgłaszając status za pomocą kodu wyjścia. To umożliwia im pisanie skryptów i "dobrych obywateli" w zautomatyzowanych środowiskach. Nawet w interaktywnym środowisku, dlaczego zmusić użytkownika do dodatkowego naciśnięcia klawisza tylko ze względu na środowisko debugowania?

Po uruchomieniu zamiast debugowania program Visual Studio otworzy okna konsoli, które zatrzymają się po wyjściu aplikacji, aby można było nadal wyświetlać dane wyjściowe. Nie wiem, dlaczego zachowanie jest inne podczas debugowania, być może dlatego, że masz dostępne punkty przerwania, więc jeśli chcesz zobaczyć dane wyjściowe na różnych etapach, możesz umieścić punkty przerwania po odpowiednich wyciągach wyjściowych lub pod koniec main lub włączyć różne opcje "zatrzymaj się przy rzucie wyjątkowym".

Bez względu na przyczynę, nigdy nie czułam się zmuszona do kompromisu w zachowaniu się mojej aplikacji, tylko po to, by poprawić jakość mojego debugowania.

+0

+1 za różnicę w zachowaniu run vs. debug. –

1

Odpowiedzi "nie rób tego" w tym wątku mogą wydawać się lakoniczne, ale są dość rozsądne. Zdarzyło mi się to pytanie, ponieważ debuguję pakiet gtest, który działał dobrze, ale teraz rozbija się tajemniczo po uruchomieniu. Po uruchomieniu z konsoli pojawia się okno dialogowe z napisem "blah.exe przestał działać"; ale, po uruchomieniu z debuggera, konsola wyskakuje na chwilę, znika, a program wychodzi ze statusem 0.

Powinienem był pomyśleć o tym, jak dziwna była ta różnica w zachowaniu, ale zamiast tego powiedziałem: "Aw, stary - muszę zrobić to okno konsoli, żeby zobaczyć, co mówi". Dobrze?

Okazuje się, że maszyna, nad którą pracuję (moja koleżanka) miała "Argumenty dowodzenia" dla debuggera ustawionego na "--gtest_filter = * testMsg *". Zauważyłem to od razu, ale nigdy nie przyszło mi do głowy, że wszystkie testy pasujące do filtra zostały zmienione w ostatnim zatwierdzeniu. Tak więc, po uruchomieniu z debuggera, program nie znalazł żadnych testów i po prostu wychodził. Kolejne 90 minut mojego życia nigdy nie wrócę. (-_-) Mogłabym rzucić to trochę szybciej, gdyby moja reakcja odruchowa nie była taka, że ​​potrzebuję, aby okno konsoli było otwarte, aby rozwiązać problem ...

Powiązane problemy