การใช้ฟังก์ชัน exit ()


101

ฉันต้องการทราบว่าฉันจะใช้exit()ฟังก์ชันเช่นโปรแกรมในหนังสือของฉันได้อย่างไรและเมื่อใด:

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

เมื่อฉันเรียกมันก็แสดงให้เห็นข้อผิดพลาด: การเรียกร้องให้ออกจากฟังก์ชั่นที่ไม่ได้กำหนด ()

นอกจากนี้ฉันต้องการทราบว่าฉันจะสร้างตัวเลือกเพื่อปิดหน้าต่างที่โปรแกรมทำงานได้อย่างไร? ตัวอย่างเช่นผมทำโปรแกรมเมนูขับเคลื่อนที่มีหลายตัวเลือกและหนึ่งในนั้นคือ"ออกจากเมนู" ฉันจะออกจากโปรแกรมได้อย่างไร (เช่นปิดหน้าต่าง)


8
หากคุณต้องการคำตอบให้จัดรูปแบบรหัสและคำถามเพื่อให้ผู้อื่นอ่านได้ และอย่าตะโกน!

3
รูปแบบรหัสเป็นสิ่งหนึ่ง แต่เขียนได้ไม่ดี คุณไม่ต้องการคำตอบที่มีลักษณะเช่นนี้ใช่ไหม
Kobi

54
เอ๊ย! gotos และออก? ดวงตาของฉัน! มันไหม้!
Kyle

8
ฉันไม่ใช่ C-Expert และไม่สามารถเขียนได้โดยไม่ยากดังนั้นฉันอาจคิดผิดเกี่ยวกับเรื่องนี้ ... แต่ฉันขอแนะนำให้คุณทิ้งหนังสือเล่มนั้นไปได้ไหม การใช้ goto ใน C ก็เหมือน ... เหมือน ... ไม่รู้ และถ้าคุณขอโทษตอนนี้พวกเขาคิดว่าจะเปิดประตูได้อย่างไร * hides.in.the.kitchen * ...
Bobby

8
goto ยังคงเป็นไวยากรณ์ที่ถูกต้องใน C มันอาจจะไม่ได้รับการอนุมัติโวหารแต่ก็ยังใช้ได้ void main()OTOH เป็นเพียงผิดธรรมดา เช่นเดียวกับที่exit();ผิดและการละเว้น#include <stdlib.h>ก็ผิด
wildplasser

คำตอบ:


167

ลองใช้exit(0);แทน exitฟังก์ชั่นคาดว่าพารามิเตอร์จำนวนเต็ม #include <stdlib.h>และไม่ลืมที่จะ


4
หน้าคนบอกว่า "` การใช้ EXIT_SUCCESS และ EXIT_FAILURE เล็กน้อยพกพามากขึ้น (เพื่อสภาพแวดล้อมที่ไม่ใช่ UNIX) กว่าการใช้ 0 คนและบางค่าไม่ใช่ศูนย์เช่น 1 หรือ -1 `."
Mawg กล่าวว่าคืนสถานะโมนิกา

82

exitฟังก์ชั่นจะมีการประกาศในส่วนหัว STDLIB ดังนั้นคุณจำเป็นต้องมี

#include <stdlib.h>

ที่ด้านบนของโปรแกรมของคุณเพื่อให้สามารถใช้งานexitได้

ยังทราบว่าexitจะใช้เวลาอาร์กิวเมนต์จำนวนเต็มดังนั้นคุณจึงไม่สามารถเรียกมันชอบexit()คุณจะต้องเรียกว่าเป็นหรือexit(0) exit(42)0 มักจะหมายถึงโปรแกรมของคุณเสร็จสมบูรณ์และค่าที่ไม่ใช่ศูนย์จะถูกใช้เป็นรหัสข้อผิดพลาด

นอกจากนี้ยังมีมาโครที่กำหนดไว้ล่วงหน้าEXIT_SUCCESSและEXIT_FAILUREเช่นexit(EXIT_SUCCESS);


3
+1 สำหรับไม่เพียง แต่การกล่าวขวัญว่าexitจะเกิดการโต้เถียงจำนวนเต็ม #include <stdlib.h>แต่อธิบายว่าทำไมมันต้องใช้อาร์กิวเมนต์จำนวนเต็มและคอมไพเลอร์บางอย่างต้องชัดเจน
Variadicism

มาโครที่กำหนดไว้ล่วงหน้าดังกล่าวถูกกำหนดไว้ในเวลาการรวบรวมใช่หรือไม่?
carloswm85

12

exit(int code);ถูกประกาศstdlib.hดังนั้นคุณต้องมีไฟล์

#include <stdlib.h>

นอกจากนี้:
- คุณไม่มีพารามิเตอร์สำหรับพารามิเตอร์exit()นี้ แต่ต้องintระบุดังนั้น
- เบิร์นหนังสือเล่มนี้มันใช้goto(สำหรับทุกคนยกเว้นแฮ็กเกอร์เคอร์เนล linux) แย่มากมากแย่มาก

แก้ไข:
โอ้และ

void main()

ก็ไม่ดีเช่นกัน:

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

ใช่มันเขียนไว้ในหนังสือว่าอย่าใช้ goto bt เพื่อความสมบูรณ์ของหนังสือ m เพียงแค่ยกตัวอย่างให้คุณ ... ดังนั้นหนังสือไม่ได้แย่ขนาดนั้น !!
Kraken

5
gotoบางครั้งเป็นสิ่งที่ถูกต้อง (และเคอร์เนล Linux มีตัวอย่างมากมาย แต่ไม่ใช่รหัสเดียวที่สามารถใช้งานได้) แต่ตัวอย่างของ OP ไม่ได้เป็นหนึ่งในกรณีเหล่านั้นอย่างชัดเจนดังนั้นใช่แล้วหนังสือเล่มนั้นควรถูกเผา :)
Adam Rosenfield

11

ลองคนออกจาก


โอ้และ:

#include <stdlib.h>

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

โดยเฉพาะอย่างยิ่งลอง "man 2 exit" จากคอนโซล เอกสาร c มีรายละเอียดค่อนข้างมาก
จัสติน

ใช่คุณคือ @Bertrand Marron
Justin

7

exit()ฟังก์ชั่นเป็นชนิดของฟังก์ชั่นที่มีประเภทผลตอบแทนโดยไม่มีข้อโต้แย้ง ซึ่งกำหนดโดยไฟล์ส่วนหัว stdlib

คุณจำเป็นต้องใช้( exit(0) or exit(EXIT_SUCCESS))หรือ หรือ(exit(non-zero)exit(EXIT_FAILURE) )


4

ตัวอย่างต่อไปนี้แสดงการใช้งานexit()ฟังก์ชัน

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

เอาต์พุต

เริ่มรายการ ....
ออกจากโปรแกรม ....


2

คุณต้องเพิ่มเส้นด้วย#include <stdlib.h>ที่จะรวมไฟล์ส่วนหัวที่และต้องส่งคืนค่าเพื่อกำหนดจำนวนเต็มบางอย่างในexitexit(any_integer)


2

นอกเหนือจากการส่งคืนรหัสออกไปยังกระบวนการหลัก -

ใน UNIX สิ่งสำคัญที่ฉันคิดว่าถูกทิ้งไว้คือ exit () ในการเรียกครั้งแรก (ในลำดับย้อนกลับ) ฟังก์ชันเหล่านั้นทั้งหมดซึ่งลงทะเบียนโดย atexit () call

โปรดดูรายละเอียดใน SUSv4


1

บนยูนิกซ์เช่นการออกจากระบบปฏิบัติการเป็นของกลุ่มการเรียกระบบ การเรียกระบบเป็นการเรียกแบบพิเศษที่เปิดใช้งานรหัสผู้ใช้ (รหัสของคุณ) เพื่อเรียกรหัสเคอร์เนล ดังนั้นการออกจากการโทรจึงทำให้การดำเนินการล้างระบบปฏิบัติการเฉพาะบางอย่างก่อนที่จะคืนการควบคุมไปยังระบบปฏิบัติการจะยุติโปรแกรม

#include <stdlib.h>

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

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

คอมไพเลอร์บางตัวจะให้ opcode เดียวกันกับคุณจากทั้งสองตัวอย่างนี้ แต่บางตัวอย่างไม่ให้ ตัวอย่างเช่น opcode จากฟังก์ชันแรกจะไม่รวม opcode การวางตำแหน่งสแต็กใด ๆ ซึ่งจะรวมอยู่ในตัวอย่างที่สองเหมือนกับฟังก์ชันอื่น ๆ คุณสามารถรวบรวมทั้งสองตัวอย่างและแยกชิ้นส่วนออกแล้วคุณจะเห็นความแตกต่าง

คุณสามารถใช้การออกจากส่วนใดก็ได้ของโค้ดของคุณและตรวจสอบให้แน่ใจว่ากระบวนการสิ้นสุดลง อย่าลืมใส่พารามิเตอร์จำนวนเต็ม


-2

เขียนไฟล์ส่วนหัว#include<process.h>และแทนที่exit();ด้วยexit(0);. สิ่งนี้จะใช้ได้กับ Turbo C อย่างแน่นอน สำหรับคอมไพเลอร์อื่น ๆ ฉันไม่รู้


1
<process.h> `ไม่ได้มาตรฐาน ฟังก์ชั่นในการประกาศexit <stdlib.h>
Keith Thompson

<process.h> ไม่สามารถแก้ปัญหานี้ได้ คุณเข้าใจคำถามที่ถูกถามหรือไม่?
CuriousMind

-3

การเขียนโปรแกรมไม่ดี การใช้ฟังก์ชัน goto เป็นสิ่งที่ไม่มีในการเขียนโปรแกรม C
รวมไฟล์ส่วนหัว stdlib.h ด้วยการเขียน#include <iostream.h>เพื่อใช้exit()ฟังก์ชัน โปรดจำไว้ว่าฟังก์ชัน exit () ใช้อาร์กิวเมนต์จำนวนเต็ม ใช้exit(0)ถ้าโปรแกรมทำงานสำเร็จและexit(-1)หรือออกจากฟังก์ชันโดยมีค่าที่ไม่ใช่ศูนย์เป็นอาร์กิวเมนต์หากโปรแกรมมีข้อผิดพลาด


1
<iostream.h>เฉพาะสำหรับ C ++ และไม่เกี่ยวข้องกับ<stdlib.h>ส่วนหัวที่จำเป็นจริงๆ ข้อโต้แย้งเพียงพกพาไปที่exitฟังก์ชั่นมี0, และEXIT_SUCCESS EXIT_FAILUREการใช้ค่าที่ไม่ใช่ศูนย์เพื่อแสดงถึงความล้มเหลวนั้นเฉพาะสำหรับระบบที่เหมือน UNIX (และอาจเป็นระบบอื่น ๆ ) อย่าพึ่งพาในรหัสพกพา
Keith Thompson

-4

รวมstdlib.hไว้ในส่วนหัวของคุณแล้วโทรไปที่abort();ใดก็ได้ที่คุณต้องการออกจากโปรแกรมของคุณ แบบนี้:

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

เมื่อผู้ใช้เข้าสู่สวิตช์ยอมรับสิ่งนี้และมอบให้กับกรณีที่ 3 ที่คุณเรียกใช้abortฟังก์ชัน มันจะออกจากหน้าจอของคุณทันทีหลังจากกดปุ่ม Enter


6
abortจะไม่ได้สิ่งที่เหมาะสมที่จะเรียกที่นี่ก็จะไม่เรียกatexitรถยกหรือล้างบัฟเฟอร์เปิดแฟ้ม ควรใช้สำหรับการยุติโปรแกรมที่ผิดปกติเท่านั้นเช่นการยืนยันล้มเหลวเป็นต้นสำหรับการยุติโปรแกรมตามปกติexitควรใช้
Adam Rosenfield

-6

ใช้ process.h แทน stdlib และ iostream ... มันจะทำงานได้ 100%


4
ฉันไม่รู้ว่า process.h คืออะไร; ไม่ใช่มาตรฐาน C อย่างแน่นอนและจะไม่ทำงานกับระบบที่ไม่มีให้ <iostream>ส่วนหัวเป็นเฉพาะกับ C ++; คำถามคือเกี่ยวกับ C.
Keith Thompson

1
นี่ไม่ใช่ Yahoo! คำตอบมันคือ Stack Overflow ถ้าจะตอบคุณต้องทดสอบก่อนเป็นอย่างน้อย!
wizzwizz4
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.