Kezdőoldal » Számítástechnika » Programozás » Miért záródik be egy egyszerű...

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?

Figyelt kérdés

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...



2021. ápr. 18. 16:01
 1/5 anonim ***** válasza:
86%

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.

2021. ápr. 18. 16:08
Hasznos számodra ez a válasz?
 2/5 anonim ***** válasza:
100%
Nem furcsa ez, debug módban természetes, hogy másként viselkedik a kódod, egyszerűen nem teszel a kódod végére semmit, amit a programnak végre kellene hajtania, ezért befejezi a munkát. Ha a kódod végére teszel pl. egy "getchar();" függvényt máris van egy feladata a programnak, amit még kilépés előtt végre kell hajtania. Ezzel megvárja a felhasználót, hogy beírjon egy karaktert, majd utána lép ki.
2021. ápr. 18. 16:09
Hasznos számodra ez a válasz?
 3/5 anonim ***** válasza:
100%

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();

2021. ápr. 18. 16:11
Hasznos számodra ez a válasz?
 4/5 anonim ***** válasza:
100%

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.

2021. ápr. 18. 17:22
Hasznos számodra ez a válasz?
 5/5 A kérdező kommentje:

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!

2021. ápr. 19. 17:10

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!