Sử dụng hàm exit ()


99

Tôi muốn biết làm thế nào và khi nào tôi có thể sử dụng exit()chức năng như chương trình trong sách của tôi:

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

Khi tôi chạy nó, nó hiển thị LỖI: gọi đến hàm không xác định exit () .

Ngoài ra, tôi muốn biết làm thế nào tôi có thể tạo một tùy chọn để đóng cửa sổ mà chương trình chạy? Ví dụ: tôi đã thực hiện một chương trình hướng menu có một số tùy chọn và một trong số chúng là "thoát khỏi menu" . Làm cách nào để thoát khỏi chương trình (tức là đóng cửa sổ)?


8
Nếu bạn muốn có câu trả lời, hãy định dạng mã và câu hỏi của bạn để mọi người có thể đọc được. VÀ ĐỪNG BỎ LỠ!

3
Định dạng mã là một chuyện, nhưng điều này được viết kém. Bạn không muốn câu trả lời trông như thế này, phải không?
Kobi

53
oy! gotos và thoát ra? Đôi mắt của tôi! Chúng cháy!
Kyle

8
Tôi không phải là Chuyên gia C và tôi không thể viết nó mà không gặp khó khăn vì vậy tôi có thể sai về điều này ... nhưng tôi có thể đề nghị bạn vứt cuốn sách đó đi không? Sử dụng goto trong C giống như ... giống như ... tôi không biết. Và nếu bạn cho tôi xin lỗi bây giờ, họ đã tìm ra cách để cửa mở * hides.in.the.kitchen * ...
Bobby

8
Chà, goto vẫn là cú pháp hợp lệ trong C. Nó có thể bị từ chối về mặt phong cách , nhưng nó vẫn hợp lệ. void main()OTOH hoàn toàn sai . Giống như exit();là sai, và bỏ qua #include <stdlib.h>là sai.
wildplasser

Câu trả lời:


165

Hãy thử sử dụng exit(0);thay thế. Các exitchức năng hy vọng một tham số nguyên. Và đừng quên #include <stdlib.h>.


2
Các trang người đàn ông nói "` Việc sử dụng EXIT_SUCCESS và EXIT_FAILURE là hơi cầm tay hơn (tới môi trường không dành UNIX) so với việc sử dụng 0 và một số giá trị khác không như 1 hoặc -1 `."
Mawg nói Khôi phục Monica

82

Các exitchức năng được khai báo trong tiêu đề stdlib, vì vậy bạn cần phải có

#include <stdlib.h>

ở đầu chương trình của bạn để có thể sử dụng exit.

Cũng lưu ý rằng exitcó đối số là số nguyên, vì vậy bạn không thể gọi nó là like exit(), bạn phải gọi là exit(0)hoặc exit(42). 0 thường có nghĩa là chương trình của bạn đã hoàn thành thành công và các giá trị khác không được sử dụng làm mã lỗi.

Cũng có các macro được xác định trước EXIT_SUCCESSEXIT_FAILURE, ví dụ:exit(EXIT_SUCCESS);


3
+1 vì không chỉ đề cập đến việc exitsử dụng đối số là số nguyên mà còn giải thích lý do tại sao nó nhận đối số là số nguyên và một số trình biên dịch yêu cầu rõ ràng #include <stdlib.h>.
Chủ nghĩa đa dạng

Các macro xác định trước đã đề cập được xác định trong thời gian biên dịch, phải không?
carloswm85

11

exit(int code);được khai báo, stdlib.hvì vậy bạn cần một

#include <stdlib.h>

Ngoài ra:
- Bạn không có tham số cho exit(), nó yêu cầu intcung cấp một tham số.
- Ghi cuốn sách này, nó sử dụng goto(dành cho tất cả mọi người trừ các hacker hạt nhân linux) xấu, rất, rất , RẤT tệ.

Chỉnh sửa:
Ồ và

void main()

cũng tệ, đó là:

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

yeah nó được viết trong cuốn sách mà bạn tốt hơn không nên sử dụng goto bt vì lợi ích của cuốn sách. m chỉ cho bạn một ví dụ ... vì vậy cuốn sách không tệ như vậy !!
Kraken

5
gotođôi khi là điều đúng đắn phải làm (và nhân Linux cung cấp nhiều ví dụ về điều đó, nhưng nó không phải là mã duy nhất có thể sử dụng nó). Nhưng ví dụ của OP rõ ràng không phải là một trong những trường hợp đó, vì vậy phải, cuốn sách đó nên được đốt đi :).
Adam Rosenfield

11

Hãy thử lối ra của người đàn ông .


Ồ, và:

#include <stdlib.h>

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

Cụ thể hơn, hãy thử "thoát man 2" từ một bảng điều khiển. Tài liệu c khá chi tiết.
Justin

Đúng bạn là @Bertrand Marron
Justin

7

Các exit()chức năng là một loại chức năng với một kiểu trả về mà không có một cuộc tranh cãi. Nó được định nghĩa bởi tệp tiêu đề stdlib.

Bạn cần sử dụng ( exit(0) or exit(EXIT_SUCCESS))hoặc (exit(non-zero)hoặc exit(EXIT_FAILURE) ).


4

Ví dụ sau đây cho thấy cách sử dụng của exit()hàm.

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

Đầu ra

Bắt đầu chương trình ....
Thoát khỏi chương trình ....


2

Bạn phải thêm một dòng với #include <stdlib.h>để bao gồm tệp tiêu đề đó và exitphải trả về một giá trị để gán một số nguyên vào exit(any_integer).


2

Ngoài việc trả lại mã thoát cho quy trình mẹ -

Trong UNIX, một khía cạnh quan trọng mà tôi nghĩ đã bị loại bỏ là exit () ở lần gọi đầu tiên (theo thứ tự ngược lại) tất cả các hàm đó, được đăng ký bởi lệnh gọi atexit ().

Vui lòng tham khảo SUSv4 để biết thêm chi tiết.


1

trên unix như hệ điều hành thoát thuộc về nhóm các cuộc gọi hệ thống. lệnh gọi hệ thống là các lệnh gọi đặc biệt cho phép mã người dùng (mã của bạn) gọi mã hạt nhân. vì vậy cuộc gọi thoát thực hiện một số hành động dọn dẹp cụ thể của hệ điều hành trước khi trả lại quyền điều khiển cho hệ điều hành, nó sẽ chấm dứt chương trình.

#include <stdlib.h>

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

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

Một số trình biên dịch sẽ cung cấp cho bạn cùng một opcode từ cả hai ví dụ này nhưng một số thì không. Ví dụ opcode từ chức năng đầu tiên sẽ không bao gồm bất kỳ loại opcode định vị ngăn xếp nào sẽ được bao gồm trong ví dụ thứ hai giống như bất kỳ chức năng nào khác. Bạn có thể biên dịch cả hai ví dụ và tháo rời chúng và bạn sẽ thấy sự khác biệt.

Bạn có thể sử dụng lối ra từ bất kỳ phần nào trong mã của mình và đảm bảo rằng quá trình đó kết thúc. Đừng quên bao gồm tham số số nguyên.


-2

Viết tệp tiêu đề #include<process.h>và thay thế exit();bằng exit(0);. Điều này chắc chắn sẽ hoạt động trong Turbo C; cho các trình biên dịch khác mà tôi không biết.


1
<process.h> `là không chuẩn. Các exitchức năng được khai báo trong <stdlib.h>.
Keith Thompson

<process.h> sẽ không giải quyết được vấn đề này. Bạn đã hiểu câu hỏi được hỏi chưa?
CuriousMind

-3

Thực hành lập trình tồi. Sử dụng hàm goto là một điều hoàn toàn không có trong lập trình C.
Cũng bao gồm tệp tiêu đề stdlib.h bằng cách viết #include <iostream.h>cho exit()hàm sử dụng . Cũng nên nhớ rằng hàm exit () nhận đối số là số nguyên. Sử dụng exit(0)nếu chương trình hoàn thành thành công vàexit(-1) hoặc thoát khỏi hàm với bất kỳ giá trị nào khác 0 làm đối số nếu chương trình có lỗi.


1
<iostream.h>dành riêng cho C ++ và không liên quan đến <stdlib.h>tiêu đề thực sự cần thiết. Những lập luận chỉ cầm tay với exitchức năng là 0, EXIT_SUCCESS, và EXIT_FAILURE. Việc sử dụng bất kỳ giá trị nào khác 0 để biểu thị lỗi chỉ dành riêng cho các hệ thống giống UNIX (và có thể là một số hệ thống khác); không dựa vào nó trong mã di động.
Keith Thompson

-4

Bao gồm stdlib.htrong tiêu đề của bạn, và sau đó gọi abort();ở bất kỳ nơi nào bạn muốn thoát khỏi chương trình của mình. Như thế này:

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

Khi người dùng nhập công tắc sẽ chấp nhận điều này và đưa nó vào trường hợp 3 nơi bạn gọi aborthàm. Nó sẽ thoát khỏi màn hình của bạn ngay lập tức sau khi nhấn phím enter.


6
abortkhông điều thích hợp để gọi ở đây, nó sẽ không gọi atexitxử lý hoặc tuôn ra bộ đệm tập tin mở. Nó chỉ nên được sử dụng để kết thúc chương trình bất thường, ví dụ như xác nhận không thành công, vv. Đối với kết thúc chương trình bình thường, exitnên được sử dụng.
Adam Rosenfield

-6

Sử dụng process.h thay vì stdlib và iostream ... Nó sẽ hoạt động 100%.


4
Tôi không biết process.h là gì; nó chắc chắn không phải là tiêu chuẩn C và sẽ không hoạt động trên các hệ thống không cung cấp nó. Các <iostream>tiêu đề là cụ thể cho C ++; câu hỏi là về C.
Keith Thompson

1
Đây không phải là Yahoo! Câu trả lời, đó là Stack Overflow. Nếu bạn trả lời, ít nhất bạn cần phải kiểm tra nó trước!
wizzwizz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.