Oto pytanie, którego nie do końca rozumiem:
Polecenie system("pause");
jest nauczane dla nowych programistów jako sposób na wstrzymanie programu i oczekiwanie na kontynuację wprowadzania danych z klawiatury. Jednak wielu doświadczonych programistów wydaje się być postrzegane jako coś, czego nie powinno się robić w różnym stopniu.
Niektórzy mówią, że jest w porządku. Niektórzy twierdzą, że można go używać tylko wtedy, gdy jesteś zamknięty w swoim pokoju i nikt nie patrzy. Niektórzy mówią, że osobiście przyjdą do twojego domu i zabiją cię, jeśli go użyjesz.
Ja sam jestem nowym programistą bez formalnego szkolenia programistycznego. Używam go, ponieważ nauczono mnie, jak go używać. Czego nie rozumiem, to to, że jeśli nie jest to coś, czego można użyć, to dlaczego zostałem nauczony tego używać? A może z drugiej strony, czy naprawdę nie jest tak źle?
Co myślisz na ten temat?
Odpowiedzi:
Jest źle widziany, ponieważ jest to hack specyficzny dla platformy, który nie ma nic wspólnego z faktyczną nauką programowania, ale zamiast tego obejść funkcję IDE / OS - okno konsoli uruchomione z Visual Studio zamyka się, gdy program zakończy wykonywanie, i tak nowy użytkownik nie widzi wyjścia swojego nowego programu.
Bodging in System („pauza”) uruchamia program „pauza” z wiersza poleceń systemu Windows i czeka na jego zakończenie, zanim będzie kontynuował wykonywanie programu - okno konsoli pozostaje otwarte, więc można odczytać dane wyjściowe.
Lepszym pomysłem byłoby umieszczenie punktu przerwania na końcu i debugowanie go, ale to znowu powoduje problemy.
źródło
pause
jest to polecenie wewnętrznecmd.exe
). Brakuje również listy lepszych pomysłów.IsDebuggerPresent()
zwraca wartość true i odpowiednio udokumentuj to obejście („dlaczego ten kod jest tutaj?”).Jest wolny. To zależy od platformy. To niepewne.
Po pierwsze: co to robi. Nazywanie „system” jest dosłownie jak wpisywanie polecenia w wierszu poleceń systemu Windows. Jest mnóstwo konfiguracji i porzucania aplikacji, aby wykonać takie wywołanie - a koszty ogólne są po prostu śmieszne.
Co się stanie, jeśli program o nazwie „pauza” zostanie umieszczony w ścieżce użytkownika? Samo wywołanie systemu („pauza”) gwarantuje tylko wykonanie programu o nazwie „pause” (mam nadzieję, że nie masz pliku wykonywalnego o nazwie „pause”!)
Po prostu napisz własną funkcję „Pause ()”, która używa _getch. OK, jasne, _getch jest również zależne od platformy (uwaga: jest zdefiniowane w "conio.h") - ale jest dużo ładniejsze niż
system()
gdy tworzysz na Windows i ma ten sam efekt (chociaż to Ty jesteś odpowiedzialny za dostarczenie tekstu z cout lub tak).Zasadniczo: po co wprowadzać tak wiele potencjalnych problemów, skoro można po prostu dodać dwa wiersze kodu i jeden dołączyć i uzyskać znacznie bardziej elastyczny mechanizm?
źródło
_getch
, zwłaszcza gdy zapewnia to standardowy C ++getchar
.prosta getchar () powinna wystarczyć.
źródło
Używanie
system("pause");
jest Ungood Practice ™, ponieważTo zupełnie niepotrzebne .
Aby zachować konsoli otwartym oknie programu na końcu po uruchomieniu go z Visual Studio, stosowania Ctrl+ F5do uruchomienia go bez debugowania, albo umieścić punkt przerwania w ostatniej prawej klamra
}
zmain
. Więc nie ma problemu z Visual Studio. I oczywiście nie ma żadnego problemu, gdy uruchamiasz go z wiersza poleceń.Jest to problematyczne i denerwujące,
gdy uruchamiasz program z wiersza poleceń. Aby wykonać interaktywne wykonanie, musisz nacisnąć klawisz na końcu bez żadnego celu. I do wykorzystania w automatyzacji niektórych zadań, które
pause
są bardzo niepożądane!Nie jest przenośny.
Unix-land nie ma standardowego
pause
polecenia.pause
Polecenie to wewnętrznacmd.exe
komenda i nie może być zmieniona, jak błędnie twierdzi się w co najmniej jednej innej odpowiedzi. To znaczy, że nie jest to zagrożenie bezpieczeństwa, a twierdzenie, że programy antywirusowe diagnozują to jako takie, jest równie wątpliwe, jak twierdzenie o nadpisaniu polecenia (w końcu program wywołujący C ++system
jest w stanie zrobić wszystko, co może zrobić interpreter poleceń, i jeszcze). Ponadto, chociaż ten sposób wstrzymywania jest wyjątkowo nieefektywny w porównaniu ze zwykłymi standardami programowania w C ++, nie ma to żadnego znaczenia na końcu programu nowicjusza.Tak więc twierdzenia w hordzie odpowiedzi przed tym nie są poprawne, a głównym powodem, dla którego nie powinieneś używać
system("pause")
ani żadnego innego polecenia czekania na końcu twojegomain
, jest pierwszy punkt powyżej: jest to całkowicie niepotrzebne, nie służy absolutnie żadnemu celowi , to jest po prostu bardzo głupie.źródło
Podsumowując, musi wstrzymać wykonywanie programów i wykonać wywołanie systemowe oraz przydzielić niepotrzebne zasoby, gdy można użyć czegoś tak prostego jak cin.get (). Ludzie używają Systemu („PAUSE”), ponieważ chcą, aby program czekał, aż naciśną klawisz Enter, aby zobaczyć swoje dane wyjściowe. Jeśli chcesz, aby program czekał na dane wejściowe, są wbudowane funkcje, które są również wieloplatformowe i mniej wymagające.
Dalsze wyjaśnienia w tym artykule.
źródło
Możesz skorzystać
std::cin.get()
ziostream
:#include <iostream> // std::cout, std::cin using namespace std; int main() { do { cout << '\n' << "Press the Enter key to continue."; } while (cin.get() != '\n'); return 0; }
Poza tym,
system('pause')
jest powolny, a zawiera plik prawdopodobnie nie potrzeba:stdlib.h
. Jest zależny od platformy i faktycznie wywołuje „wirtualny” system operacyjny.źródło
System("pause")
na pierwszym roku programowania, ale chciałem mieć możliwość uruchamiania programów na moim Macu, więc musiałem się czegoś nauczyćcin.get()
.Ponieważ nie jest przenośny.
jest programem tylko dla systemu Windows / DOS, więc ten kod nie będzie działał pod Linuksem. Co więcej,
system
nie jest powszechnie uważany za bardzo dobry sposób, aby wywołać inny program - jest to zwykle lepiej użyćCreateProcess
lubfork
czy coś podobnego.źródło
Jak wymieniono w innych odpowiedziach, istnieje wiele powodów, dla których można tego uniknąć. Wszystko sprowadza się do jednego powodu, który sprawia, że reszta jest dyskusyjna.
System()
Funkcja jest z natury niepewne / niezaufane, i nie powinny być wprowadzane do programu, chyba że jest to konieczne.W przypadku zadania studenckiego warunek ten nigdy nie został spełniony iz tego powodu nie zaliczyłbym zadania nawet bez uruchamiania programu, gdyby było obecne wywołanie tej metody. (Było to jasne od samego początku.)
źródło
Dla mnie generalnie nie ma sensu czekać przed wyjściem bez powodu. Program, który wykonał swoją pracę, powinien po prostu zakończyć się i przekazać swoje zasoby twórcy.
Nie można też po cichu czekać w ciemnym kącie po dniu pracy, czekając, aż ktoś się przechyli.
źródło
system("pause")
sam w sobie nic nie wyświetla. Program interfejsu wiersza poleceń, który jest wywoływany nie z linii poleceń i zamyka się zbyt wcześnie, jest wywoływany nieprawidłowo i z niewłaściwymi opcjami, a używanie gosystem("pause")
do obejścia błędnie wywołanego programu nie jest naprawdę właściwe.cat
,less
,vi
,OpenOffice
,Mathematica
,GNU Octave
, co, jeśli oni by użyćsystem("pause")
? To byłoby denerwujące.system("pause")
, podczas gdy twoja odpowiedź mówi o „poczekaniu przed wyjściem”, co jest znacznie bardziej uogólnioną koncepcją. Wiele z przykładów, które podałeś, faktycznie "poczekaj przed zakończeniem", dopóki użytkownik nie poinformuje programu, że chce, aby zakończył. Zgadzam się, żesystem("pause")
nie jest to dobry sposób na osiągnięcie tego celu i że istnieją lepsze rozwiązania, ale nie tak mówi twoja odpowiedź.pause
precz!system("pause");
jest błędne, ponieważ jest częścią interfejsu API systemu Windows, więc nie będzie działać w innych systemach operacyjnych.
Powinieneś spróbować użyć tylko obiektów ze standardowej biblioteki C ++. Lepszym rozwiązaniem będzie napisanie:
cin.get(); return 0;
Ale spowoduje to również problemy, jeśli masz inne
cin
znaki w swoim kodzie. Ponieważ po każdymcin
dotknięciu znakuEnter
lub,\n
który jest znakiem spacji.cin
ignoruje ten znak i pozostawia go w strefie buforowej, alecin.get()
otrzymuje ten pozostały znak. Tak więc kontrola programu dociera do linii,return 0
a konsola zostaje zamknięta przed wyświetleniem wyników.Aby rozwiązać ten problem, piszemy kod w następujący sposób:
cin.ignore(); cin.get(); return 0;
źródło
system()
jest standardem i nie jest specyficzne dla MS Windows. Jednakpause
polecenie powłoki jest dziedzictwem DOS i zwykle można je znaleźć tylko tam.Oto jeden powód, dla którego nie powinieneś go używać: wkurza większość programów antywirusowych działających w systemie Windows, jeśli przekazujesz program na inną maszynę, ponieważ stanowi zagrożenie dla bezpieczeństwa. Nawet jeśli twój program składa się tylko z prostego,
cout << "hello world\n"; system("pause");
ma duże zasoby i program uzyskuje dostęp do polecenia cmd, które antywirusy postrzegają jako zagrożenie.źródło
profesjonaliści do korzystania z systemu („PAUZA”); tworzenie małych części programu służy do samodzielnego debugowania. jeśli użyjesz go do uzyskania wyników zmiennych przed i po każdym używanym procesie, aby upewnić się, że działają one poprawnie.
Po przetestowaniu i wprowadzeniu pełnego obrotu z resztą rozwiązania należy usunąć te linie. przydaje się przy testowaniu algorytmu zdefiniowanego przez użytkownika i upewnianiu się, że wykonujesz czynności we właściwej kolejności, aby uzyskać pożądane wyniki.
W żadnym wypadku nie chcesz używać tego w aplikacji po przetestowaniu i upewnieniu się, że działa poprawnie. Jednak pozwala na śledzenie wszystkiego, co się dzieje, na bieżąco. W ogóle nie używaj go do aplikacji użytkowników końcowych.
źródło
To kwestia stylu. Jest to przydatne do debugowania, ale poza tym nie powinno być używane w ostatecznej wersji programu. Naprawdę nie ma to znaczenia w kwestii pamięci, ponieważ jestem pewien, że ci faceci, którzy wymyślili system („pauza”), spodziewali się, że będzie on często używany. Z innej perspektywy komputery są ograniczane w pamięci dla wszystkiego, czego używamy na komputerze i nie stanowi to bezpośredniego zagrożenia, takiego jak dynamiczna alokacja pamięci, więc poleciłbym to do debugowania kodu, ale nic więcej.
źródło
pause
został zaprojektowany do użytku w programach wsadowych DOS, nigdy nie był przeznaczony do używania w taki sposób. Co więcej, istniały o wiele lepsze alternatywy, zanim ktokolwiek był na tyle szalony, by wpisać to zdaniesystem("pause");
.