Miért záródik be egy egyszerű C program scanf() után, ha a futtatható fájlt az asztalról indítom és nem parancssorból?
A kérdés adott. Windows rendszer alatt, ha egy teljesen egyszerű C-ben írt program .exe állományát asztalról indítom, akkor egyből bezáródik az ablak, amikor beírok neki egy egyszerű számot.
Ha ugyan ezt az exe fájlt PowerShellből vagy Windows CMD -ből indítom, akkor meg hibátlanul lefut. Ez elég furcsa...
Konzolos program, ugye?
Az ugyanis éppen így működik, nem csak C programmal, hanem akár egy sima bat fájllal is.
Vagy nem értem a kérdést.
Ez azért van, mert amikor a Powershellből vagy a CMD-ből indítod a programot, a program lefutása után a Powershellnek illetve a CMD-nek adja vissza a vezérlést; ellenkező esetben meg a Windowsnak, ami a lefutott program által nyitott ablakot szépen lezárja.
Ezt megakadályozandólag berakhatsz egy ilyesmit a program végére (a main függvény return 0-ja elé):
printf("Nyomj egy Enter-t a folytatáshoz:\n");
getchar();
Azért, mert a mai modern operációs rendszerek kétféle módon működő programot kezelnek:
- Grafikus felhasználói felülettel rendelkező programok (böngészők, Total Commander, Steam, stb.)
- Karakteres felhasználói felülettel rendelkező programok (DISKPART, NETSH és egyéb segédprogramok, illetve amit te írsz most)
A karakteres felhasználói felülettel rendelkező programok alapvetően nem arra valók, hogy duplaklikkel az asztalon elindítsd őket! Ezeket ma terminál emulátor alól futtatjuk (ezt látod, ha megnyitod a Parancssort vagy a Windows PowerShell-t).
Szóval a jelenség, amit tapasztalsz: Ha nem valamelyik terminál emulátorból indítod el a programodat, hanem az asztalon duplaklikkel indítod el, a terminál emulátor bár megnyílik, de amint a programod futása véget ér, be is záródik. Ezért nem látod az eredményt, mert ez nagyon gyorsan történik.
A helyes módszer az, hogy megnyitod a terminál emulátort (Parancssort vagy Windows PowerShell-t), és abban indítod el a programodat. Így látni fogod az eredményt.
Erre szokták azt mondani a tutoriálok, amit erősen ajánlott NEM követni, hogy a programod végére tegyél egy sort beolvasó utasítást:
#include <stdlib.h>
int main() {
.. //a programkódod
.. puts("Nyomj entert a kilépéshez!");
.. getchar();
.. return EXIT_SUCCESS;
}
Vagy Windows alatt a még rosszabb változata, mert a system hívás miatt platformfüggővé teszed a kódodat:
#include <stdlib.h>
int main() {
.. //a programkódod
.. system("pause"); //a pause parancs csak Windows alatt működik
.. return EXIT_SUCCESS;
}
És hogy ez miért akkora nagy probléma? Azért, mert a karakteres felhasználói felületre szánt programok igen nagy része automatizálható ún. shell scriptek használatával. Nem tudom, hallottál-e a youtube-dl nevű programoról - ez szintén egy karakteres felhasználói felülettel rendelkező segédprogram, ami YouTube-ról és más oldalakról tud videókat letölteni.
Képzeld el, hogy találtál egy csomó jó zenét a YouTube-on (mondjuk úgy 60 számot), amit szeretnél a kocsidban hallgatni, és ezt nem szeretnéd egyesével letölteni és átkonvertálni állandó kattintgatásokkal. Szóval csinálhatod azt, hogy egy TXT-be elmented a youtube linkeket, amiket le szeretnél szedni, és írsz egy shell scriptet, hogy a youtube-dl letöltse azokat, majd az ffmpeg pedig átkonvertálja arra a formátumra, amit a kocsid magnója felismer. Na, de ha az ffmpeg vagy youtube-dl is azt csinálná, hogy "üss entert a kilépéshez", akkor minden egyes letöltött szám után a shell scripted addig megállna, amíg nem ütsz entert, ahelyett, hogy haladna automatikusan és csinálná a dolgát.
Igen, így már érthető. Valóban az volt a baj, hogy a program egyből bezáródott, ha asztalról indítottam és nem terminálból emiatt nem látszott a vége. Csakhogy én próbáltam a getchar() -al, de úgy sem volt jó.
Mint kiderült az volt a baj, hogy miután a scanf()-nek megadtam az inputot és entert nyomtam, azt az entert egy új sor karakternek érzékelte a program és egyből be is adta a kicsit lejjebb lévő getchar()-nak, ezért így is bezáródott. Most a scanf()-be még be kellett írni az input típusa után egy "%*c" -t, így ez nem történik meg újra.
Néha kicsit érdekesen működik a C nyelv...
Köszönöm a segítségeket!
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!