Exit () işlevinin kullanımı


101

exit()Kitabımdaki program gibi işlevi nasıl ve ne zaman kullanabileceğimi bilmek istiyorum :

#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");
}

Çalıştırdığımda HATA gösteriyor: tanımsız çıkış () işlevine çağrı .

Ayrıca, programın çalıştığı pencereyi kapatmak için nasıl bir seçenek oluşturabileceğimi bilmek istiyorum. Örneğin, birkaç seçeneği olan ve biri "menüden çık" olan menü odaklı bir program yaptım . Bunu programdan nasıl çıkarabilirim (yani pencereyi kapatabilirim)?


8
Cevaplar istiyorsanız, kodunuzu ve sorunuzu insanların okuyabileceği şekilde biçimlendirin. VE BAĞIRMAYIN!

3
Kod biçimi bir şeydir, ancak bu kötü yazılmıştır. Böyle görünen cevaplar istemezsin, değil mi?
Kobi

54
oy! gotos ve çıkış? Gözlerim! Yanıyorlar!
Kyle

8
Ben C-Expert değilim ve bunu zorlanmadan yazabilirim, bu yüzden bu konuda yanılıyor olabilirim ... ama o kitabı atmanızı önerebilir miyim? Goto'yu C'de kullanmak ... sanki ... bilmiyorum. Ve şimdi izin verirseniz, mutfaktaki * gizli kapıları nasıl açacaklarını buldular ...
Bobby

8
Eh, goto hala C'de geçerli bir sözdizimidir. Biçimsel olarak onaylanmayabilir , ancak yine de geçerlidir. void main()OTOH düpedüz yanlıştır . Tıpkı exit();yanlış olduğu ve ihmal #include <stdlib.h>etmek yanlış olduğu gibi.
wildplasser

Yanıtlar:



82

exitEğer olması gerekir, böylece fonksiyon, stdlib başlığında bildirildi

#include <stdlib.h>

programınızın üst kısmında kullanabilmeniz için exit.

Ayrıca bunun exitbir tamsayı argümanı aldığına dikkat edin, bu nedenle onu gibi exit()çağıramazsınız, exit(0)veya olarak çağırmanız gerekir exit(42). 0 genellikle programınızın başarıyla tamamlandığı anlamına gelir ve sıfır olmayan değerler hata kodları olarak kullanılır.

Ayrıca önceden tanımlanmış makrolar EXIT_SUCCESSve EXIT_FAILUREörneğinexit(EXIT_SUCCESS);


3
+1, sadece exitbir tamsayı argümanı aldığından bahsetmekle kalmayıp, aynı zamanda neden bir tamsayı argümanı aldığını ve bazı derleyicilerin açık olanı gerektirdiğini açıkladığı için #include <stdlib.h>.
Variadicism

Belirtilen önceden tanımlanmış makrolar derleme zamanında tanımlanır, değil mi?
carloswm85

12

exit(int code);içinde beyan edildiğinden stdlib.hbir

#include <stdlib.h>

Ayrıca:
- için parametreniz yok exit(), bu intyüzden bir tane sağlayın.
- Bu kitabı yazın goto(linux kernel hackerları hariç herkes için) kötü, çok, çok , ÇOK kötüdür.

Düzenleme:
Oh, ve

void main()

aynı zamanda kötü, bu:

int main(int argc, char *argv[])

evet kitapta, kitabın bütünlüğü uğruna goto bt kullansanız iyi olur, size sadece bir örnek veriyorum ... bu yüzden kitap o kadar da kötü değil !!
Kraken

5
gotobazen yapılması gereken doğru şeydir (ve Linux çekirdeği bunun birçok örneğini sağlar, ancak onu kullanabilen tek kod bu değildir). Ancak OP'nin örneği açıkça bu durumlardan biri değil, bu yüzden evet, o kitap yakılmalıdır :).
Adam Rosenfield

11

Adam çıkışını dene .


Oh ve:

#include <stdlib.h>

int main(void) {
  /*  ...  */
  if (error_occured) {
    return (EXIT_FAILURE);
  }
  /*  ...  */
  return (EXIT_SUCCESS);
}

Daha spesifik olarak, bir konsoldan "adam 2 çıkışını" deneyin. C belgeleri oldukça ayrıntılıdır.
Justin

Haklısın @Bertrand Marron
Justin

7

exit()İşlev, bağımsız değişken olmayan bir dönüş türü fonksiyonunun bir türüdür. Stdlib başlık dosyasıyla tanımlanır.

( exit(0) or exit(EXIT_SUCCESS))Veya (exit(non-zero)veya kullanmanız gerekir exit(EXIT_FAILURE) ).


4

Aşağıdaki örnek, exit()işlevin kullanımını göstermektedir .

#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;
}

Çıktı

Programın başlangıcı .... Programdan
çıkılıyor ....


2

Bu #include <stdlib.h>başlık dosyasını dahil etmek için ile bir satır eklemelisiniz ve exitbir değer döndürmelisiniz, böylece içine bir tamsayı atayın exit(any_integer).


2

Üst işleme bir çıkış kodu döndürmeye ek olarak -

UNIX'te, dışarıda bırakıldığını düşündüğüm önemli bir husus, atexit () çağrısı tarafından kaydedilen tüm bu işlevleri ilk çağırdığında (ters sırada) exit () olmasıdır.

Ayrıntılar için lütfen SUSv4'e bakın.


1

unix gibi işletim sistemlerinde çıkış, sistem çağrıları grubuna aittir. sistem çağrıları, kullanıcı kodunun (kodunuzun) çekirdek kodunu çağırmasını sağlayan özel çağrılardır. bu nedenle çıkış çağrısı, kontrolü işletim sistemine döndürmeden önce işletim sistemine özgü bazı temizleme eylemlerini gerçekleştirir, programı sonlandırır.

#include <stdlib.h>

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

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

Bazı derleyiciler size bu örneklerin her ikisinden de aynı işlem kodunu verecektir, ancak bazıları vermeyecektir. Örneğin, birinci işlevden gelen işlem kodu, başka herhangi bir işlev için olduğu gibi ikinci örneğe dahil edilecek olan herhangi bir yığın konumlandırma işlem kodunu içermeyecektir. Her iki örneği de derleyip parçalara ayırabilirsiniz ve farkı göreceksiniz.

Kodunuzun herhangi bir bölümünden çıkış kullanabilir ve işlemin sona erdiğinden emin olabilirsiniz. Tamsayı parametresini eklemeyi unutmayın.


-2

Başlık dosyası yaz #include<process.h>ve değiştirme exit();ile exit(0);. Bu kesinlikle Turbo C'de çalışacaktır; diğer derleyiciler için bilmiyorum.


1
<process.h> `standart değildir. exitFonksiyonu bildirilmiştir <stdlib.h>.
Keith Thompson

<process.h> bu sorunu çözmeyecek. Sorulan soruyu anladınız mı?
CuriousMind

-3

Kötü programlama uygulaması. Bir goto fonksiyonunun kullanılması, C programlamasında tam bir hayır hayırdır.
Ayrıca, işlevi #include <iostream.h>kullanmak için yazarak stdlib.h başlık dosyasını dahil edin exit(). Ayrıca exit () işlevinin bir tamsayı argümanı aldığını unutmayın. exit(0)Program başarıyla tamamlandıysa kullanın ve exit(-1)veya programda hata varsa, sıfır olmayan herhangi bir değerle işlevden çıkın.


1
<iostream.h>C ++ 'ya özgüdür ve <stdlib.h>aslında gerekli olan başlık ile ilgili değildir . Sadece taşınabilir argümanlar exitişleve vardır 0, EXIT_SUCCESSve EXIT_FAILURE. Başarısızlığı belirtmek için sıfır olmayan herhangi bir değerin kullanımı UNIX benzeri sistemlere (ve muhtemelen diğerlerine) özgüdür; taşınabilir kodda ona güvenmeyin.
Keith Thompson

-4

Başlığınıza ekleyin stdlib.hve ardından abort();programınızdan çıkmak istediğiniz herhangi bir yeri arayın . Bunun gibi:

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

Kullanıcı anahtara girdiğinde bunu kabul eder ve bunu abortfonksiyonu çağırdığınız duruma 3 verir . Enter tuşuna bastıktan hemen sonra ekranınızdan çıkacaktır.


6
abortolduğu değil burada aramak, bu demeyeceksin uygun şey atexitişleyicileri veya gömme açık dosya tamponlarını. Yalnızca anormal program sonlandırması için kullanılmalıdır, örneğin başarısız iddialar vb. Normal program sonlandırması exitiçin kullanılmalıdır.
Adam Rosenfield

-6

Stdlib ve iostream yerine process.h kullanın ...% 100 çalışacaktır.


4
Process.h'nin ne olduğunu bilmiyorum; kesinlikle standart C değildir ve bunu sağlamayan sistemlerde çalışmayacaktır. <iostream>Başlık C ++ özeldir; soru C ile ilgili
Keith Thompson

1
Bu Yahoo değil! Cevaplar, Stack Overflow. Cevap verirseniz, en azından önce test etmiş olmanız gerekir!
wizzwizz4
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.