Làm thế nào để giữ cho cửa sổ giao diện điều khiển mở trong Visual C ++?


191

Tôi đang bắt đầu trong Visual C ++ và tôi muốn biết cách giữ cửa sổ giao diện điều khiển.

Ví dụ, đây sẽ là một ứng dụng "hello world" điển hình:

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    return 0;
}

Dòng tôi đang thiếu là gì?


Amruth A. Pillai mã của bạn không hiển thị "nhấn phím bất kỳ để tiếp tục" cảm ơn

Bạn có thể tự in bằng lệnh gọi std :: cout đơn giản.
Raúl Roa

5
Nhược điểm của tất cả các giải pháp được đề xuất là không có giải pháp nào trong số chúng hoạt động với gỡ lỗi (Ctrl + F5 không thành công ở đây) và khi ứng dụng dừng đột ngột (tất cả các điểm dừng hoặc đọc từ stdin khi quay lại chính đều thất bại ở đây). Những gì tôi muốn thấy là một cửa sổ giao diện điều khiển trong IDE như Eclipse và các IDE khác có. Họ chỉ đơn giản tiếp tục hiển thị đầu ra cho thiết bị xuất chuẩn / thiết bị xuất chuẩn sau khi chương trình kết thúc.
dr. Sybren

@sybren Câu trả lời được chấp nhận hoạt động với CTRL + F5 và tại sao bạn muốn có một giải pháp hoạt động với gỡ lỗi (F5)? Chắc chắn toàn bộ quan điểm gỡ lỗi là .. gỡ lỗi? Lợi ích của việc có một bàn điều khiển bị tạm dừng sau khi kết thúc chương trình, trong một phiên gỡ lỗi là gì?
JBentley

2
@JBentley Eclipse và các IDE khác cho phép bạn đọc kết quả đầu ra của chương trình ngay cả sau khi quá trình kết thúc. Chắc chắn bạn thấy lợi ích gia tăng, đặc biệt là khi cố gắng tìm lỗi? Ngoài ra, một điểm dừng chỉ hoạt động khi bạn biết nơi chương trình kết thúc, điều này có thể khó nhận biết khi đầu ra biến mất khỏi màn hình của bạn.
dr. Sybren

Câu trả lời:


389

Bắt đầu dự án với Ctrl+F5thay vì chỉ F5.

Cửa sổ giao diện điều khiển bây giờ sẽ mở với Press any key to continue . . .thông báo sau khi chương trình thoát.

Lưu ý rằng điều này yêu cầu Console (/SUBSYSTEM:CONSOLE)tùy chọn liên kết, mà bạn có thể kích hoạt như sau:

  1. Mở dự án của bạn và đi đến Solution Explorer. Nếu bạn đang theo dõi cùng tôi trong K & R, "Giải pháp" của bạn sẽ là 'xin chào' với 1 dự án theo đó, cũng là 'xin chào' in đậm.
  2. Nhấp chuột phải vào 'xin chào "(hoặc bất kể tên dự án của bạn là gì.)
  3. Chọn "Thuộc tính" từ menu ngữ cảnh.
  4. Chọn Thuộc tính cấu hình> Trình liên kết> Hệ thống.
  5. Đối với thuộc tính "Hệ thống con" trong ngăn bên phải, nhấp vào hộp thả xuống ở cột bên phải.
  6. Chọn "Bảng điều khiển (/ SUBSYSTEM: TIÊU THỤ)"
  7. Nhấp vào Áp dụng, đợi cho đến khi hoàn thành bất kỳ việc gì, sau đó nhấp vào OK. (Nếu "Áp dụng" chuyển sang màu xám, hãy chọn một số tùy chọn hệ thống con khác, nhấp vào Áp dụng, sau đó quay lại và áp dụng tùy chọn bảng điều khiển. Kinh nghiệm của tôi là bản thân nó sẽ không hoạt động.)

CTRL-F5 và các gợi ý hệ thống con hoạt động cùng nhau; chúng không phải là những lựa chọn riêng biệt

(Được phép của DJMorreTX từ http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6 )


36
Điều này chạy chương trình mà không cần gỡ lỗi; tốt hơn là có một giải pháp hoạt động ở cả chế độ gỡ lỗi và chạy thông thường.
ス ー パ ー ミ コ ン

3
Đối với bất kỳ ai không thể có được giải pháp này để làm việc trong một dự án makefile, thì đây là do lỗi trong Visual Studio. Tôi vừa đăng một câu trả lời với bản sửa lỗi.
JBentley

1
Có thể xác nhận! Có một ứng dụng giao diện điều khiển không hoạt động đã làm điều này và nó hoạt động. Bạn không cần thay đổi mã của mình với cin.get(),getchar(), system("pause")hoặc bất kỳ rác nào khác. Thay đổi công trình này.
Callat

Ctrl + F5 có nghĩa là 'Bắt ​​đầu mà không cần gỡ lỗi'. Vì vậy, bạn không thể sử dụng điều này khi gỡ lỗi. Chỉ cần thêm system("pause");vào cuối mã của bạn. Nó có ý nghĩa và hoạt động tốt.
Milad

41

Cách tiêu chuẩn là cin.get()trước khi tuyên bố trở lại của bạn.

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    cin.get();
    return 0;
}

4
Tôi biết vì chương trình đã sử dụng cout mà nó đã được quan tâm, nhưng tôi nghĩ rằng đáng để đề cập rằng bạn sẽ cần #include <iostream> cũng như sử dụng không gian tên std: std :: cin.get () .
Brian

7
Điều này hoạt động nhưng Ctrl + F5 tốt hơn nhiều đặc biệt là khi truy tìm sự phá hủy đối tượng toàn cầu, v.v.
Ternary

8
-1 cho _tmain. Tôi sẽ bình chọn -1 khác cin.get()thay vì đặt điểm dừng cho F5 hoặc sử dụng Ctrl F5. Nhưng tôi chỉ cho phép một downvote.
Chúc mừng và hth. - Alf

8
@Cheers: Có chuyện gì với _tmain? Đó là cách tiêu chuẩn để viết một ứng dụng Windows nhắm vào hệ thống con Console. Đi lệch khỏi tiêu chuẩn đó là những gì sẽ là thực tiễn xấu. Rõ ràng, không ai nói về mã di động ở đây; câu hỏi cho biết Visual C ++ và _tmainlà chữ ký xuất hiện trong mã mẫu. Đã đến lúc từ bỏ tôn giáo này. Windows là "không chuẩn" theo mặc định và có những lý do rất chính đáng để tuân theo các tiêu chuẩn của nó .
Cody Grey

8
@CodyGray: Downvote của tôi _tmainlà vì nó hoàn toàn không cần thiết ( tiêu chuẩn C ++ quốc tế yêu cầu đơn giản main) và vì nó sử dụng Tsơ đồ macro của Microsoft , điều này không cần thiết phải phức tạp và hỗ trợ cho việc hỗ trợ Windows 9x. Nếu bạn cảm thấy sai lệch so với tiêu chuẩn là thực hành xấu, thì bạn tuyệt đối không nên sử dụng tmain. Không có lý do chính đáng để sử dụng tmain, ngoại trừ việc trolling hoặc, đối với các chuyên gia, để hiển thị sự bất tài hoàn toàn của một người.
Chúc mừng và hth. - Alf

24

Đặt một điểm dừng trên returndòng.

Bạn đang chạy nó trong trình gỡ lỗi, phải không?


15
khó khăn nhất vì có thể có nhiều điểm thoát trong chương trình
volzotan

Chương trình có thể không bắt đầu do thiếu DLL và không bao giờ đạt đến điểm dừng đó
Michael

17

Một lựa chọn khác là sử dụng

#include <process.h>
system("pause");

Mặc dù điều này không dễ mang theo vì nó sẽ chỉ hoạt động trên Windows, nhưng nó sẽ tự động in

Bấm phím bất kỳ để tiếp tục...


1
hệ thống ("tạm dừng") Sẽ giữ cho bộ xử lý của bạn chạy, nó không nên được sử dụng. Sử dụng cin.get () hoặc tương đương.
Krythic

systemđược khai báo trong <stdlib.h>.
melpomene

@Krythic Tôi mới dùng thử và nó không ăn CPU 100%. Sử dụng bộ xử lý của tôi ở mức 0% - 1% toàn bộ thời gian. Không thể tái sản xuất.
melpomene

hệ thống ("tạm dừng") sẽ gọi lệnh "tạm dừng" theo cmd, vốn KHÔNG sử dụng CPU mọi lúc. Nó tương đương với _getche ().
Paul Stelian

7

Đối với các dự án makefile, giải pháp được chấp nhận không thành công, do lỗi trong Visual Studio (hiện diện ít nhất cho đến phiên bản 2012 - Tôi chưa thử nghiệm 2013). Lỗi này được trình bày chi tiết tại đây .

Để tạm dừng giao diện điều khiển sau khi kết thúc chương trình trong dự án makefile, hãy thực hiện các bước này (điều này có thể khác với các phiên bản khác ngoài 2010 - 2012):

1) Truyền /SUBSYSTEM:CONSOLEcho liên kết. - EDIT : xem bên dưới.

2) Mở tệp dự án của bạn (.vcxproj) trong trình soạn thảo văn bản.

3) Bên trong <project>thẻ gốc , chèn các mục sau:

<ItemDefinitionGroup>
  <Link>
    <SubSystem>Console</SubSystem>
  </Link>
</ItemDefinitionGroup>

4) Tải lại dự án trong giải pháp của bạn.

5) Chạy chương trình mà không cần gỡ lỗi (CTRL + F5).

BIÊN TẬP:

Theo nhận xét của tôi dưới đây, việc đặt tùy chọn trình liên kết /SUBSYSTEM:CONSOLEthực sự không liên quan đến các dự án makefile (và thậm chí không nhất thiết có thể, nếu bạn đang sử dụng trình biên dịch khác ngoài MSVC). Tất cả vấn đề là cài đặt được thêm vào tệp .vcxproj, như bước 3 ở trên.


Tôi chưa bao giờ nghe nói về bước 3 đó trước đây. Bạn có chắc chắn rằng đó là yêu cầu và hoạt động?
Vịt Mooing

@mooingduck Vâng, và sau khi nhận xét của tôi về câu trả lời của bạn ở đây , tôi đã phát hiện ra rằng việc chuyển /SUBSYSTEM:CONSOLEđến trình liên kết thực sự không liên quan - bước 3 là tất cả vấn đề. Hãy nhớ rằng câu trả lời của tôi liên quan đến các dự án makefile - trong một dự án makefile, IDE không có cách nào để biết những gì bạn đang chuyển đến trình liên kết (thậm chí bạn có thể không sử dụng trình biên dịch có /SUBSYSTEM:CONSOLEtùy chọn) và đó là dự án chính nó theo dõi xem nó có nghĩa là một chương trình giao diện điều khiển hay không. Tôi sẽ chỉnh sửa câu trả lời của tôi cho phù hợp.
JBentley

1
@mooingduck Tôi cũng có thể xác nhận rằng tôi sử dụng giải pháp này cho mình trong một dự án makefile, với SCons là hệ thống xây dựng và MSVC và MinGW làm trình biên dịch. Không có cách nào khác tôi biết để khiến IDE tạm dừng bàn điều khiển sau khi chấm dứt ở chế độ không gỡ lỗi.
JBentley

1
@chuckleplant Tôi không sợ, quy trình làm việc của tôi là cách khác, gọi SCons từ VS. Ban đầu, tôi đã tự tạo các dự án VS makefile của mình để chúng chuyển các biến cấu hình cho tập lệnh SCons của tôi (ví dụ: 32/64 bit, tên trình biên dịch, phát hành / gỡ lỗi), sau đó xử lý phần còn lại của logic. Trong thiết lập đó, không cần các tệp dự án thay đổi, vì vậy tôi đã không sử dụng bất kỳ tính năng tự động tạo nào của SCons. Tôi đã chuyển sang Linux nên tôi không sử dụng VS nữa. Vì đó là lỗi VS, nên có thể đáng để gửi yêu cầu tính năng cho SCons để xử lý bước bổ sung cần thiết.
JBentley

1
Ngoài ra, bạn chỉ có thể bao gồm một số mã Python trong tập lệnh SCons để tự làm điều đó mỗi khi tệp dự án được tạo. Tôi tin rằng các tệp dự án VS tuân thủ tiêu chuẩn XML, do đó việc thêm các phần tử còn thiếu khá dễ dàng và chỉ cần một vài dòng mã. Tôi sẽ đề nghị bắt đầu từ đây (đối với Python 2.x) hoặc tại đây (3.x). Câu trả lời này cũng có thể được quan tâm.
JBentley

4

Bạn có thể sử dụng cin.get();hoặc cin.ignore();ngay trước câu lệnh quay lại để tránh cửa sổ giao diện điều khiển đóng.


4

chỉ cần đặt một điểm dừng trên khung xoăn cuối cùng của chính.

    int main () {
       //...your code...
       return 0;
    } //<- breakpoint here

Nó hoạt động với tôi, không cần phải chạy mà không cần gỡ lỗi. Nó cũng thực thi các hàm hủy trước khi nhấn vào điểm dừng để bạn có thể kiểm tra bất kỳ thông báo nào được in trên các hàm hủy này nếu bạn có.


3

Chỉ cần thêm Breakpoint vào khung đóng của _tmainphương thức của bạn . Đây là cách dễ dàng hơn cộng với việc bạn không phải thêm mã để gỡ lỗi.


2

Đặt một điểm dừng trên nẹp kết thúc của main(). Nó sẽ bị vấp ngay cả với nhiều returncâu lệnh. Nhược điểm duy nhất là một cuộc gọi đếnexit() sẽ không bị bắt.

Nếu bạn không gỡ lỗi, hãy làm theo lời khuyên trong câu trả lời của Zoidberg và bắt đầu chương trình của bạn bằng Ctrl+ F5thay vì chỉ F5.


2

2 lon của tôi:

Lựa chọn 1: Thêm một điểm dừng ở cuối main()

Lựa chọn 2: Thêm mã này, ngay trước return 0;:

std::cout << "Press ENTER to continue..."; //So the User knows what to do
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Bạn cần bao gồm <iomanip>chostd::numeric_limits


2

chỉ cần thêm hệ thống ("tạm dừng") vào cuối mã trước khi trả về 0 như thế này

#include <stdlib.h>

int main()
{
    //some code goes here
    system("pause")
    return 0;
}


2

cin.get()hoặc system("PAUSE"). Tôi chưa nghe nói bạn có thể sử dụngreturn(0);


1

Tôi bao gồm #include <conio.h>và sau đó, thêm getch();ngay trước return 0;dòng. Dù sao đó cũng là những gì tôi học được ở trường. Các phương pháp được đề cập ở trên là khá khác nhau tôi thấy.


2
-1: Bên cạnh thực tế là việc tạm dừng chương trình thường là giải pháp sai (vì trong hầu hết các trường hợp không phải là hành vi bạn muốn nhị phân được phát hành của mình có), conio.h không chuẩn , lỗi thời và là một Tiêu đề C, không phải C ++! Thật không may, có rất nhiều thực hành lập trình xấu được dạy trong trường học.
JBentley

Người ta hy vọng nó chỉ được sử dụng trong quá trình thử nghiệm, nó không phải là thứ bạn giữ trong phiên bản cuối cùng. Nếu bạn đang mã hóa cho Windows thì vấn đề với #include <conio.h> / _getch ();? Nó được viết nhanh hơn cin.get (), không cần nhấn 2 phím (ít nhất là một ký tự + enter) và không chỉ hoạt động trong gỡ lỗi hoặc chỉ trong chế độ phát hành. Có chuyện gì vậy?
Barnack

1

Có cùng một vấn đề. Tôi đang sử dụng _getch()ngay trước khi tuyên bố trở lại. Nó hoạt động.


Bạn có thể muốn thêm các ví dụ và giải thích vào mã của mình, đặc biệt đối với một câu hỏi được hỏi / trả lời từ lâu. Ngoài ra, bạn trả lời có chức năng giống hệt với một số câu trả lời cũ hơn và sử dụng cùng một cuộc gọi như một câu trả lời hiện có khác.
Đồng hồ-Muse

0

(Một số tùy chọn có thể được gọi bằng các tên khác nhau. Tôi không sử dụng phiên bản tiếng Anh)

Tôi gặp vấn đề tương tự, khi tôi tạo các dự án với tùy chọn "dự án trống", Tạo dự án là "ứng dụng bảng điều khiển Win32" thay vì "dự án trống". Trong hộp thoại bật lên bây giờ, bạn nhấn "tiếp tục" và sau đó bạn có thể kiểm tra tùy chọn "dự án trống" và nhấn xác nhận. Sau đó, CTRL + F5 sẽ mở bảng điều khiển không tự động đóng.


0

Tôi đã từng gặp vấn đề tương tự; Trong ứng dụng của tôi có nhiều điểm thoát () và không có cách nào để biết chính xác nó thoát ra ở đâu, sau đó tôi phát hiện ra điều này:

atexit(system("pause"));

hoặc là

atexit(cin.get());

Bằng cách này, nó sẽ dừng lại cho dù chúng ta thoát khỏi chương trình ở đâu.


Không ai trong số đó là cuộc gọi hợp lệ đến atexit. atexitlấy một con trỏ hàm, không phải là một số nguyên.
melpomene

0

Một lựa chọn khác:

#ifdef _WIN32
#define MAINRET system("pause");return 0
#else
#define MAINRET return 0
#endif

Trong chính:

int main(int argc, char* argv[]) {
    MAINRET;
}

0

Trên thực tế, giải pháp thực sự là lựa chọn mẫu dự án. Bạn PHẢI chọn Ứng dụng Bảng điều khiển Win32 trong VS cũ hơn hoặc điền tên dự án trước rồi nhấp đúp vào Trình hướng dẫn Windows Desktop và sau đó chọn ứng dụng Bảng điều khiển Win32. Sau đó chọn dự án trống vào thời điểm này. Điều này sau đó cho phép những gì người hỏi ban đầu thực sự muốn mà không cần thêm điểm dừng và giữ mã. Tôi đã trải qua vấn đề này là tốt. Câu trả lời cũng tại trang web MSDN.


0

Đây là một cách để giữ cho cửa sổ lệnh mở bất kể việc thực thi dừng như thế nào mà không sửa đổi bất kỳ mã nào:

Trong Visual Studio, mở Trang thuộc tính dự án -> Gỡ lỗi .

Đối với chỉ huy , nhập$(ComSpec)

Đối với các đối số lệnh , nhập /k $(TargetPath). Nối bất kỳ đối số vào ứng dụng của riêng bạn.

Bây giờ F5 hoặc Ctrl-F5 thực thi Windows / System32 / cmd.exe trong một cửa sổ mới và / k đảm bảo rằng dấu nhắc lệnh vẫn mở sau khi thực hiện xong.

Nhược điểm là việc thực thi sẽ không dừng lại ở các điểm dừng.


0

Như một số người đã chỉ ra, giải pháp Zoidberg không đính kèm trình gỡ lỗi, đây là điều bạn thường không muốn.

Imo tùy chọn tốt nhất là định cấu hình VS phù hợp (từ VS 2017 trở đi), bằng cách đi tới Công cụ> Tùy chọn> Gỡ lỗi> Chung. Ở đó bạn bỏ chọn "Tự động đóng bàn điều khiển khi dừng gỡ lỗi" (ở dưới cùng), có thể được kiểm tra trong trường hợp của bạn.


-1

bạn chỉ có thể đặt keep_window_open (); trước khi trở lại đây là một ví dụ

int main()
{
    cout<<"hello world!\n";
    keep_window_open ();
    return 0;
}

2
Keep_window_open () đến từ đâu, ví dụ tập tin & thư viện tiêu đề nào?
Tom Goodfellow

từ std_lib_facilities.h này, nhưng hầu hết các lần bạn có nó
Sifis Babionitakis
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.