Làm thế nào để ngăn ứng dụng bảng điều khiển C ++ thoát khỏi ngay lập tức?


193

Gần đây, tôi đã cố gắng học C ++ từ trang web này . Thật không may, bất cứ khi nào tôi cố gắng chạy một trong các mẫu mã, tôi thấy chương trình đó mở trong khoảng nửa giây và sau đó đóng lại ngay lập tức. Có cách nào để ngăn chương trình đóng cửa ngay lập tức để tôi có thể thấy thành quả của nỗ lực của mình không?


5
Bạn đang bấm đúp vào thực thi? Bạn đang làm việc trong Windows? Tại sao bạn không làm việc từ shell Command và gõ các lệnh như bạn muốn chúng được thực thi?
S.Lott

8
@S Lott: Bởi vì nếu bạn nhấn nút "Đi" trong IDE của mình, bạn không cần phải bận tâm với bảng điều khiển.
Billy ONeal

4
Bạn nên xem xét để có được một cuốn sách hay để học C ++. Trang web là tài nguyên tốt, nhưng không phù hợp cho một văn bản giới thiệu tốt. Có một danh sách chính xác các sách C ++ tại đây: stackoverflow.com/questions/388242/
Khăn

6
@Billy Nếu nhấn nút Go sẽ đóng ứng dụng khi nó kết thúc, bạn đang sử dụng IDE sai.

2
Đã hỏi và trả lời trước đây tại đây: stackoverflow.com/questions/902261/ , mặc dù cái này có tiêu đề tốt hơn.
dmckee --- ex-moderator mèo con

Câu trả lời:


120

Chỉnh sửa: Như Charles Bailey đã chỉ ra một cách đúng đắn trong một bình luận bên dưới, điều này sẽ không hoạt động nếu có các nhân vật được đệm vào stdin, và thực sự không có cách nào tốt để giải quyết vấn đề đó. Nếu bạn đang chạy với trình gỡ lỗi được đính kèm, giải pháp được đề xuất của John Dibling có lẽ là giải pháp sạch nhất cho vấn đề của bạn.

Điều đó nói rằng, tôi sẽ để nó ở đây và có thể người khác sẽ thấy nó hữu ích. Tôi đã sử dụng nó rất nhiều như một cách nhanh chóng để viết các bài kiểm tra trong quá trình phát triển.


Khi kết thúc mainchức năng của bạn , bạn có thể gọistd::getchar();

Điều này sẽ nhận được một ký tự từ stdinđó, do đó cung cấp cho bạn loại hành vi "nhấn phím bất kỳ để tiếp tục" (nếu bạn thực sự muốn có thông báo "nhấn phím bất kỳ", bạn sẽ phải tự in một ký tự).

Bạn cần phải #include <cstdio>cho getchar.


15
getcharkhông giải quyết vấn đề - hoặc ít nhất là trong những trường hợp hạn chế, ít nhất. Nó đọc một char từ stdin, nhưng nếu đã có các ký tự được đệm từ stdin, chương trình sẽ tiếp tục mà không cần chờ đợi cho dù bạn có in lời nhắc hay không.
CB Bailey

1
@Charles: Một điểm tốt. Bỏ qua cho đến khi \nlà một giải pháp một phần, nhưng sẽ không giúp ích nếu có nhiều hơn một dòng đầu vào được đệm. Tôi không biết một cách C ++ tiêu chuẩn để xóa mọi thứ khỏi luồng đầu vào. : - /
James McNellis

1
@James: Cũ, nhưng thế nào std::cin.ignore(std::cin.rdbuf()->in_avail());? Có nó từ đây .
GManNickG

1
Một lựa chọn tôi sử dụng rất nhiều là std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');với #include <limits>.
Xèo

5
Xin đừng làm điều này. :( Đây không phải là một phần chức năng của chương trình của bạn để thực hiện việc này
Các cuộc đua nhẹ nhàng trong quỹ đạo

138

Nếu bạn đang sử dụng Visual Studio và bạn đang khởi động ứng dụng bảng điều khiển ra khỏi IDE:

nhấn CTRL-F5 (bắt đầu mà không gỡ lỗi) sẽ khởi động ứng dụng và giữ cho cửa sổ giao diện điều khiển mở cho đến khi bạn nhấn bất kỳ phím nào.


1
Bắt đầu giao diện điều khiển ra khỏi IDE? Làm thế nào và tại sao bạn sẽ làm điều đó?
CodyBugstein

1
Tuyệt vời, nó đã làm việc. Tại sao đây không phải là hành vi mặc định của Visual Studio?
Đèn chiếu sáng

Tôi cũng nghĩ rằng đó là cách để làm điều đó, cho đến hôm nay, khi tôi xây dựng một chương trình điều khiển đơn giản và phương pháp trên không hoạt động :(
KansaiRobot

1
Có một phiên bản này với gỡ lỗi?
luckyging3r

109

Giải pháp của James hoạt động cho tất cả các Nền tảng.

Ngoài ra, Windowsbạn cũng có thể thêm các mục sau ngay trước khi bạn quay lại từ mainchức năng:

  system("pause");

Thao tác này sẽ chạy pauselệnh chờ cho đến khi bạn nhấn phím và cũng hiển thị một thông báo hayPress any key to continue . . .


2
Nghe có vẻ giống như một biến thể của Rube Goldberg của một giải pháp.
Dave Van den Eynde

4
@Dave Van den Eynde: Nó cũng khá phổ biến và đạt tiêu chuẩn trong mã soạn sẵn trong DevCPP. +1
Billy ONeal

4
@Dave mặt khác, nó làm rõ rằng đây chỉ là một ví dụ cho một ví dụ, trong khi std: getch có thể vô tình để lại trong mã thực.
Martin Beckett

2
Đây là một giải pháp hoàn toàn hợp lệ cho những người trên Windows. Mặc dù không lý tưởng, nhưng nó vẫn hoạt động
thecoshman

Dễ nhất, nhanh nhất, giải pháp. Chỉ cần những gì tôi cần
CodyBugstein 18/12/13

83

Nếu bạn đang sử dụng Visual C ++ 2010 Express của Microsoft và gặp sự cố với CTRL + F5 không hoạt động để giữ bàn điều khiển mở sau khi chương trình kết thúc, hãy xem chủ đề MSDN này .

Có khả năng IDE của bạn được đặt để đóng bàn điều khiển sau khi chạy CTRL + F5; thực tế, một "Dự án trống" trong Visual C ++ 2010 sẽ đóng giao diện điều khiển theo mặc định. Để thay đổi điều này, hãy làm như Microsoft Moderator đã đề xuất:

Vui lòng nhấp chuột phải vào tên dự án của bạn và đi đến trang Thuộc tính, vui lòng mở rộng Thuộc tính Cấu hình -> Trình liên kết -> Hệ thống, vui lòng chọn Bảng điều khiển (/ SUBSYSTEM: ConsolE) trong danh sách thả xuống Hệ thống con. Bởi vì, theo mặc định, dự án rỗng không chỉ định nó.


1
Nếu nó không phải là một ứng dụng console thì sao?
Jesse Pepper

3
@ Mr.Underhill Điều này sẽ chỉ hoạt động nếu bạn khởi chạy mà không có trình gỡ lỗi (Ctrl + F5).
Jonathan Mee

Ngoài việc là giải pháp không hack duy nhất, đây cũng là cách duy nhất để xem các bản in từ các hàm hủy đối tượng ngăn xếp chính.
Poniros

20

Tôi thường chỉ đặt một điểm dừng trên main()nẹp xoăn đóng. Khi kết thúc chương trình bằng bất cứ điều gì có nghĩa là điểm dừng sẽ chạm và bạn có thể ALT-Tab vào cửa sổ giao diện điều khiển để xem đầu ra.


14

Tại sao không chỉ chạy chương trình từ bàn điều khiển, tức là chạy chương trình từ cmd.exe nếu bạn đang sử dụng Windows. Bằng cách đó, cửa sổ vẫn mở sau khi chương trình kết thúc.

[EDIT]: Khi tôi sử dụng KDevelop4, có một phiên bản đầy đủ của Bash (một CLI Linux) đang chạy trong một tab ở dưới cùng của IDE. Đó là những gì tôi sử dụng trong các loại trường hợp.


3
Bởi vì nếu bạn đang sử dụng IDE, bạn thường không sử dụng bàn điều khiển. Bạn đẩy đi, chương trình chạy, và đó là nó.
Billy ONeal

3
Bất kỳ IDE có thẩm quyền nào cũng sẽ giữ giao diện điều khiển trên màn hình khi ứng dụng kết thúc - Code :: Blocks chẳng hạn thực hiện chính xác điều này.

3
@nobugz: Tôi đã tìm ra rồi. Để có được cửa sổ để dán xung quanh, bạn phải có / SUBSYSTEM: TIÊU THỤ trên dòng lệnh liên kết. Tài liệu nói rằng đây là mặc định nếu mainđược xác định, nhưng nếu tôi không đặt nó rõ ràng trên dòng lệnh, VS sẽ giết cửa sổ khi ứng dụng thoát. thở dài
James McNellis

2
@James: đó là bắt buộc để có được một cửa sổ giao diện điều khiển ở nơi đầu tiên. Đến lượt nó yêu cầu hàm main () thay vì WinMain (), không phải cách khác. Tôi hơi lạc lõng ...
Hans Passant

4
@nobugz: Nếu bạn bắt đầu từ "Dự án trống" thay vì "Ứng dụng bảng điều khiển Win32", hệ thống con không được đặt rõ ràng trong các thuộc tính của dự án. Nếu bạn xác định maintrong dự án, trình liên kết theo mặc định sẽ sử dụng hệ thống con ConsolE. Khi gỡ lỗi hoặc chạy, bạn sẽ nhận được một cửa sổ giao diện điều khiển. Tuy nhiên, trừ khi bạn chỉ định rõ ràng ConsolE là hệ thống con trong thuộc tính dự án, Visual Studio sẽ không giữ cửa sổ giao diện điều khiển mở. Tôi luôn bắt đầu từ một dự án trống và tôi hiếm khi thay đổi các thuộc tính dự án riêng lẻ, vì vậy tôi chưa bao giờ thấy cửa sổ giao diện điều khiển dính xung quanh. Xin lỗi vì sự nhầm lẫn
James McNellis

9

Trước khi kết thúc mã của bạn, hãy chèn dòng này:

system("pause");

Điều này sẽ giữ bàn điều khiển cho đến khi bạn nhấn một phím.

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s;
    cout << "Please enter your first name followed by a newline\n";
    cin >> s;
    cout << "Hello, " << s << '\n';
    system("pause"); // <----------------------------------
    return 0; // This return statement isn't necessary
}

Nó cũng in "Nhấn phím bất kỳ để tiếp tục .." cho tôi.
PapaHotelPapa

8

Gọi cin.get();2 lần:

    //...
    cin.get();
    cin.get();
    return 0
}

6
nhưng tại sao hai lần ??
Madhawa Priyashantha

Điều gì xảy ra nếu chúng ta cần một cin.get () khác để lấy ví dụ một số chuỗi bên trong mảng trước đó? Nó không hoạt động trong kịch bản này.
QMaster

4

Nếu bạn chạy mã của mình từ một IDE có thẩm quyền, chẳng hạn như Code :: Blocks , IDE sẽ quản lý bảng điều khiển mà nó sử dụng để chạy mã, giữ cho nó mở khi đóng ứng dụng. Bạn không muốn thêm mã đặc biệt để giữ cho bàn điều khiển mở, bởi vì điều này sẽ ngăn nó hoạt động chính xác khi bạn sử dụng nó thực sự, bên ngoài IDE.


3

Được rồi tôi đoán bạn đang ở trên Windows bằng Visual Studio ... tại sao? Chà vì nếu bạn đang dùng một số loại HĐH Linux thì có lẽ bạn sẽ chạy nó từ bảng điều khiển.

Dù sao, bạn có thể thêm crap vào cuối chương trình như những người khác đang đề xuất hoặc bạn chỉ cần nhấn CTRL + F5 (bắt đầu mà không cần gỡ lỗi) và Visual Studio sẽ rời khỏi bàn điều khiển sau khi hoàn tất.

Một tùy chọn khác nếu bạn muốn chạy phiên bản Debug và không thêm crap vào mã của mình là mở cửa sổ giao diện điều khiển (Bắt đầu -> Chạy -> cmd) và điều hướng đến thư mục đầu ra Debug của bạn . Sau đó, chỉ cần nhập tên thực thi của bạn và nó sẽ chạy chương trình gỡ lỗi của bạn trong bảng điều khiển. Sau đó, bạn có thể sử dụng tệp đính kèm của Visual Studio để xử lý hoặc một cái gì đó nếu bạn thực sự muốn.


3
#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{

    cout << "Press any key to continue...";
    getch();

    return 0;
}

Tôi đã không nhận thấy bất cứ ai khác đăng bài này vì vậy nó ở đây.


Tôi muốn thêm rằng đó conio.hlà một tiêu đề cụ thể của Windows và có thể không có sẵn ở mọi máy (hoặc bạn có thể cần liên kết nó một cách riêng biệt, đây là một quá mức cần thiết).
Yksisarvinen

Đang làm việc. chỉ cần thay đổi getch (); để _getch (); kể từ khi nó trở nên mất giá
ncesar

2

Nếu bạn thực sự gỡ lỗi ứng dụng của mình trong Visual C ++, hãy nhấn F5 hoặc hình tam giác màu xanh lá cây trên thanh công cụ. Nếu bạn không thực sự gỡ lỗi nó (bạn không có điểm dừng được đặt), hãy nhấn Ctrl + F5 hoặc chọn Bắt đầu mà không gỡ lỗi trên các menu (thường là trên menu Gỡ lỗi, tôi đồng ý là khó hiểu.) Nó sẽ nhanh hơn một chút, và quan trọng hơn với bạn, sẽ tạm dừng ở cuối mà không cần phải thay đổi mã của bạn.

Hoặc, mở một dấu nhắc lệnh, điều hướng đến thư mục chứa exe của bạn và chạy nó bằng cách nhập tên của nó. Theo cách đó, khi nó chạy xong, dấu nhắc lệnh không đóng và bạn có thể thấy đầu ra. Tôi thích cả hai phương pháp này để thêm mã dừng ứng dụng khi hoàn thành.


2

Chỉ cần thêm phần sau vào cuối chương trình của bạn. Nó sẽ cố gắng nắm bắt một số dạng đầu vào của người dùng để nó dừng giao diện điều khiển tự động đóng lại.

cin.get();

2

Thêm các dòng sau trước bất kỳ exit()chức năng hoặc trước bất kỳ returns trong main():

std::cout << "Paused, press ENTER to continue." << std::endl;
cin.ignore(100000, "\n");

Điều này không hiệu quả với tôi, dòng đầu tiên hoạt động nhưng nhấn enter không làm gì cả
Qwertie

2

Đối với Visual Studio (và chỉ Visual Studio) đoạn mã sau đây cung cấp cho bạn lời nhắc 'chờ nhấn phím để tiếp tục' thực sự chờ người dùng nhấn một phím mới một cách rõ ràng, bằng cách trước tiên xóa bộ đệm đầu vào:

#include <cstdio>
#include <tchar.h>
#include <conio.h>

_tprintf(_T("Press a key to continue "));
while( _kbhit() /* defined in conio.h */ ) _gettch();
_gettch();

Lưu ý rằng điều này sử dụng tchar.hmacro để tương thích với nhiều 'bộ ký tự' (như VC ++ gọi chúng).


2

Tôi chỉ làm điều này:

//clear buffer, wait for input to close program
std::cin.clear(); std::cin.ignore(INT_MAX, '\n');
std::cin.get();
return 0;

Lưu ý: xóa bộ đệm cin và điều đó chỉ cần thiết nếu bạn đã sử dụng cin tại một số điểm trước đó trong chương trình của mình. Ngoài ra, sử dụng std :: num_limits :: max () có lẽ tốt hơn INT_MAX, nhưng nó hơi dài dòng và thường không cần thiết.


Nó hoạt động, nhưng trả về 0; sẽ không thực thi nếu tôi sử dụng mã này.
wernersbacher

2

Sử dụng #include "stdafx.h"system("pause");giống như mã dưới đây.

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
    std::cout << "hello programmer!\n\nEnter 2 numbers: ";
    int x, y;
    std::cin >> x >> y;
    int w = x*y;
    std::cout <<"\nyour answer is: "<< w << endl;
    system("pause");
}

systemđược khai báo <cstdlib>, không stdafx.h.
melpomene

1

Ý tưởng tương tự như yeh câu trả lời, chỉ cần thay thế tối giản.

Tạo một tệp bó với nội dung sau:

helloworld.exe
pause

Sau đó sử dụng tệp bó.


1

đơn giản

#include <cstdio>

    int main(){
        // code...
        std::getchar();
        std::getchar();
        return 0;
    }

vì lý do nào đó thường có 1 ký tự có thể đọc với getchar đã có trong stdin khi bạn chạy chương trình. Vì vậy, getchar đầu tiên đọc ký tự này và getchar thứ hai đợi đầu vào của người dùng (của bạn) trước khi thoát khỏi chương trình. Và sau khi một chương trình thoát khỏi hầu hết các thiết bị đầu cuối, đặc biệt là trên thiết bị đầu cuối đóng Windows ngay lập tức. Vì vậy, những gì chúng tôi hướng đến là một cách đơn giản để ngăn chặn một chương trình hoàn thành sau khi nó xuất ra mọi thứ. Tất nhiên có nhiều cách phức tạp và rõ ràng hơn để giải quyết điều này, nhưng đây là cách đơn giản nhất.


2
Vui lòng thêm ít nhất một lời giải thích ngắn gọn về lý do tại sao điều này giải quyết vấn đề.
kaya3

0

Xem liệu IDE của bạn có hộp kiểm trong cài đặt dự án để giữ cho cửa sổ mở sau khi chương trình kết thúc. Nếu không, sử dụng std::cin.get();để đọc một ký tự ở cuối chức năng chính. Tuy nhiên, hãy chắc chắn chỉ sử dụng đầu vào dựa trên dòng (std :: getline) hoặc để xử lý các ký tự chưa đọc còn sót lại (std :: bỏ qua cho đến dòng mới) vì nếu không, .get () ở cuối sẽ chỉ đọc rác bạn để lại chưa đọc trước đó.


0

Điều này dường như hoạt động tốt:

cin.clear();
cin.ignore(2);

Nếu bạn xóa bộ đệm trước thì nó sẽ không thành vấn đề khi bạn đọc phần tiếp theo. Vì một số lý do cin.ignore(1)không hoạt động, nó phải là 2.


1
2 đôi khi cũng không đủ (khi có nhiều nét chính được xếp hàng). Cách chính xác là bỏ qua càng nhiều ký tự trong hàng đợi. Để với , cin.rdbuf()->in_avail. Không phải số ma thuật nào như 1 hay 2.
Konrad Rudolph

0

Bạn luôn có thể tạo một tệp bó. Ví dụ: nếu chương trình của bạn được gọi là helloworld.exe, một số mã sẽ là:

@echo off
:1
cls
call helloworld.exe
pause >nul
goto :1

0

Nếu bạn đang chạy Windows, thì bạn có thể làm system("pause >nul");hoặc system("pause");. Nó thực thi lệnh console để tạm dừng chương trình cho đến khi bạn nhấn phím. >nulngăn không cho nó nói Press any key to continue....


0

Tôi đang đặt một điểm dừng ở mức 0 cuối cùng của chương trình. Nó hoạt động tốt.


1
Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng bạn và khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào .
Ravi Dhoriya

1
Làm thế nào điều này không cung cấp câu trả lời? Tôi trong tình huống giống hệt như tác giả của một câu hỏi và điều này giúp.
lierosk

0

Tôi đã sử dụng cin.get()và nó đã hoạt động nhưng một ngày tôi cần sử dụng một cái khác cin.get([Array Variable])trước đó để lấy một chuỗi ling với ký tự trống ở giữa. Vì vậy, cin.get()cửa sổ nhắc lệnh không tránh đóng cửa. Cuối cùng tôi đã tìm thấy một cách khác: Nhấn CTRL + F5 để mở trong một cửa sổ bên ngoài và Visual Studio không còn quyền kiểm soát nó nữa. Chỉ cần hỏi bạn về việc đóng sau khi các lệnh cuối cùng chạy.


0

Tôi đã cố gắng đặt một getchar()chức năng ở cuối. Nhưng nó không hoạt động. Vì vậy, những gì tôi đã làm là thêm hai getchar()chức năng lần lượt. Tôi nghĩ rằng đầu tiên getchar()sẽ hấp thụ Enterphím bạn nhấn sau khi nhập dữ liệu cuối cùng. Vì vậy, hãy thử thêm hai getchar()chức năng thay vì một


0

Thay vì nhấn nút chạy, nhấn CTRL và F5 cùng một lúc, nó sẽ cung cấp cho bạn nhấn bất kỳ phím nào để tiếp tục nhắn tin. Hoặc nhập "(cảnh báo chỉ sử dụng để kiểm tra các chương trình không phải là chương trình chống vi-rút không thích !!!!)" ở cuối chức năng chính của bạn nhưng: (cảnh báo chỉ sử dụng để kiểm tra các chương trình không phải là chương trình chống vi-rút 't thích nó !!!!)


0

chỉ cần sử dụng cin.ignore () ngay trước khi trả về 0; hai lần

main()
  {
  //your codes 

  cin.ignore();
  cin.ignore();

  return 0;
  }

đó là tất cả


Tôi thường làm điều này như thế này. cin.ignore (); cin.get ();
aj.toulan

-1

Tất cả những gì bạn phải làm là đặt một biến cho x, sau đó chỉ cần nhập giá trị này trước khi trả về 0;

cout<<"\nPress any key and hit enter to end...";
cin>>x;

-1

Bạn thậm chí có thể khai báo một số nguyên ở đầu main()hàm (giả sử int a;) và đặt std::cin >> a;ngay trước giá trị trả về. Vì vậy, chương trình sẽ tiếp tục chạy cho đến khi bạn nhấn một phím và nhập.

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.