Użycie funkcji exit ()

100

Chcę wiedzieć, jak i kiedy mogę użyć exit()funkcji takiej jak program w mojej książce:

#include<stdio.h>

void main()
{
    int goals;
    printf("enter number of goals scored");
    scanf("%d",&goals);

    if(goals<=5)
        goto sos;
    else
    {
        printf("hehe");
        exit( );
    }
    sos:
    printf("to err is human");
}

Kiedy go uruchamiam, pokazuje ERROR: wywołanie niezdefiniowanej funkcji exit () .

Chcę również wiedzieć, jak mogę utworzyć opcję zamknięcia okna, w którym działa program? Na przykład stworzyłem program oparty na menu, który miał kilka opcji, a jedną z nich było „wyjście z menu” . Jak mogę to zamknąć program (tj. Zamknąć okno)?

Kraken
źródło
8
Jeśli chcesz odpowiedzi, sformatuj swój kod i pytanie, aby inni mogli je przeczytać. I NIE KRZYCZ!
3
Format kodu to jedno, ale jest to źle napisane. Nie chcesz odpowiedzi, które wyglądają tak, prawda?
Kobi
54
oy! gotos i wyjść? Moje oczy! Płoną!
Kyle
8
Nie jestem C-ekspertem i nie mogę tego napisać bez trudności, więc mogę się co do tego mylić ... ale czy mogę zasugerować, abyś wyrzucił tę książkę? Używanie goto w C jest jak ... jak ... nie wiem. A jeśli teraz mi wybaczyć, że zorientowali się, jak otworzyć drzwi * hides.in.the.kitchen * ...
Bobby
8
Cóż, goto nadal jest prawidłową składnią w C. Może być odrzucana stylistycznie , ale nadal jest ważna. void main()OTOH jest po prostu błędny . Tak jak exit();jest złe, a pomijanie #include <stdlib.h>jest złe.
wildplasser

Odpowiedzi:

167

Spróbuj użyć exit(0);zamiast tego. exitFunkcja oczekuje parametru całkowitą. I nie zapomnij #include <stdlib.h>.

Klaus Byskov Pedersen
źródło
2
Strona człowiek mówi „` Zastosowanie EXIT_SUCCESS i EXIT_FAILURE jest nieco bardziej przenośny (do środowisk nieuniksowych) niż stosowanie 0 i pewnej wartości niezerowej jak 1 lub -1 `.”
Mawg mówi dozbrojenie Monica
82

exitFunkcja jest zadeklarowana w nagłówku stdlib, więc trzeba mieć

#include <stdlib.h>

u góry programu, aby móc z niego korzystać exit.

Zauważ również, że exitprzyjmuje argument będący liczbą całkowitą, więc nie możesz tego nazwać jak exit(), musisz wywołać jako exit(0)lub exit(42). 0 zwykle oznacza, że ​​program został pomyślnie zakończony, a wartości niezerowe są używane jako kody błędów.

Istnieją również predefiniowane makra EXIT_SUCCESSoraz EXIT_FAILUREnpexit(EXIT_SUCCESS);

Tyler McHenry
źródło
3
+1 za nie tylko wspomnienie, że exitpobiera argument będący liczbą całkowitą, ale także wyjaśnienie, dlaczego przyjmuje argument będący liczbą całkowitą i że niektóre kompilatory wymagają jawności #include <stdlib.h>.
Variadicism
Wspomniane predefiniowane makra są definiowane w czasie kompilacji, prawda?
carloswm85
11

exit(int code);jest zadeklarowany, stdlib.hwięc potrzebujesz pliku

#include <stdlib.h>

Ponadto:
- Nie masz parametru dla exit(), wymaga intwięc podania jednego.
- Spal tę książkę, używa, gotoco jest (dla wszystkich oprócz hakerów jądra Linuksa) złe, bardzo, bardzo , BARDZO złe.

Edycja:
Och, i

void main()

jest też zły, to:

int main(int argc, char *argv[])
Morfildur
źródło
tak, jest napisane w książce, że lepiej nie używaj go ze względu na kompletność książki m po prostu dając ci przykład ... więc książka nie jest taka zła !!
Kraken
5
gotood czasu do czasu jest słuszna (a jądro Linuksa dostarcza na to wielu przykładów, ale nie jest to jedyny kod, który może go używać). Ale przykład OP najwyraźniej nie jest jednym z tych przypadków, więc tak, tę książkę należy spalić :).
Adam Rosenfield,
11

Spróbuj wyjść człowiekowi .


O I:

#include <stdlib.h>

int main(void) {
  /*  ...  */
  if (error_occured) {
    return (EXIT_FAILURE);
  }
  /*  ...  */
  return (EXIT_SUCCESS);
}
Bertrand Marron
źródło
Dokładniej, spróbuj „man 2 exit” z konsoli. Dokumentacja c jest dość szczegółowa.
Justin
Racja, jesteś @Bertrand Marron
Justin
7

exit()Funkcja jest funkcją typu o typie zwrotnym bez argumentów. Jest definiowany przez plik nagłówkowy stdlib.

Musisz użyć ( exit(0) or exit(EXIT_SUCCESS))lub (exit(non-zero)lub exit(EXIT_FAILURE) ).

Nataraj Raja
źródło
4

Poniższy przykład ilustruje użycie exit()funkcji.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    printf("Start of the program....\n");
    printf("Exiting the program....\n");
    exit(0);
    printf("End of the program....\n");
    return 0;
}

Wynik

Start programu…
Wyjście z programu…

Martin max
źródło
2

Musisz dodać wiersz z, #include <stdlib.h>aby dołączyć ten plik nagłówkowy i exitmusisz zwrócić wartość, więc przypisz jakąś liczbę całkowitą w exit(any_integer).

user4508201
źródło
2

Oprócz zwrócenia kodu zakończenia do procesu nadrzędnego -

W systemie UNIX ważnym aspektem, który moim zdaniem został pominięty, jest to, że exit () przy pierwszym wywołaniu (w odwrotnej kolejności) wszystkich funkcji, które zostały zarejestrowane przez wywołanie atexit ().

Szczegółowe informacje można znaleźć w SUSv4.

ostateczna przyczyna
źródło
1

na unixowych systemach operacyjnych wyjście należy do grupy wywołań systemowych. wywołania systemowe to specjalne wywołania, które umożliwiają kodowi użytkownika (Twojemu kodowi) wywołanie kodu jądra. więc exit call wykonuje pewne działania czyszczące specyficzne dla systemu operacyjnego przed zwróceniem kontroli do systemu operacyjnego, kończy działanie programu.

#include <stdlib.h>

// example 1
int main(int argc, char *argv){
  exit(EXIT_SUCCESS);
}

// example 2
int main(int argc, char *argv){
  return 0;
}

Niektóre kompilatory podadzą ten sam kod operacji z obu tych przykładów, ale niektóre nie. Na przykład kod operacji z pierwszej funkcji nie będzie zawierał żadnego rodzaju kodu operacji pozycjonowania stosu, który zostanie uwzględniony w drugim przykładzie, tak jak w przypadku każdej innej funkcji. Możesz skompilować oba przykłady i zdemontować je, a zobaczysz różnicę.

Możesz użyć wyjścia z dowolnej części kodu i upewnić się, że proces się zakończy. Nie zapomnij dołączyć parametru typu integer.

filvarga
źródło
-2

Napisz nagłówka pliku #include<process.h>i zastąpić exit();z exit(0);. To na pewno zadziała w Turbo C; dla innych kompilatorów nie wiem.

Azeem Alvi
źródło
1
<process.h> `jest niestandardowy. exitFunkcja jest zadeklarowana <stdlib.h>.
Keith Thompson
<process.h> nie rozwiąże tego problemu. Czy zrozumiałeś zadawane pytanie?
CuriousMind
-3

Zła praktyka programistyczna. Używanie funkcji goto to kompletne „nie” w programowaniu w C.
Dołącz również plik nagłówkowy stdlib.h, pisząc w #include <iostream.h>celu użycia exit()funkcji. Pamiętaj też, że funkcja exit () przyjmuje argument będący liczbą całkowitą. Użyj, exit(0)jeśli program zakończył się pomyślnie i exit(-1)lub zakończ funkcję z dowolną wartością niezerową jako argumentem, jeśli program ma błąd.

Gaurav
źródło
1
<iostream.h>jest specyficzny dla C ++ i nie jest powiązany <stdlib.h>z nagłówkiem, który jest faktycznie potrzebny. Jedyne przenośne argumenty do exitfunkcji są 0, EXIT_SUCCESSi EXIT_FAILURE. Użycie dowolnej wartości niezerowej do oznaczenia awarii jest specyficzne dla systemów typu UNIX (i prawdopodobnie niektórych innych); nie polegaj na tym w przenośnym kodzie.
Keith Thompson
-4

Uwzględnij stdlib.hw nagłówku, a następnie wywołaj abort();w dowolnym miejscu, w którym chcesz zamknąć program. Lubię to:

switch(varName)
{
    case 1: 
     blah blah;
    case 2:
     blah blah;
    case 3:
     abort();
}

Gdy użytkownik wejdzie, przełącznik akceptuje to i przekazuje do przypadku 3, w którym wywołujesz abortfunkcję. Opuści ekran natychmiast po naciśnięciu klawisza Enter.

Muhammad Ahmad
źródło
6
abortnie jest właściwą rzeczą do wywoływania tutaj, nie będzie wywoływać atexitprogramów obsługi ani opróżniać buforów otwartych plików. Powinien być używany tylko w przypadku nieprawidłowego zakończenia programu, np. Nieudanych asercji itp. Do normalnego zakończenia programu exitpowinien być używany.
Adam Rosenfield,
-6

Użyj process.h zamiast stdlib i iostream ... Będzie działać w 100%.

Detamos
źródło
4
Nie wiem, co to jest proces. H; z pewnością nie jest to standardowe C i nie będzie działać na systemach, które go nie zapewniają. <iostream>Nagłówek jest specyficzne dla C ++; pytanie dotyczy C.
Keitha Thompsona
1
To nie jest Yahoo! Odpowiedzi, to przepełnienie stosu. Jeśli odpowiesz, musisz najpierw to przetestować!
wizzwizz4