cuốn sách gpt4 ai đã làm

控制 c 导致打印垃圾

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 00:06:12 28 4
mua khóa gpt4 Nike

Tôi đang tạo một chương trình thử nghiệm nhỏ thể hiện giao diện bảng điều khiển thô sơ.

Chương trình này là một dòng nhận thông thường, chương trình phản hồi thậm chí không nhận ra "thoát" và muốn bạn buộc thoát bằng cách nhấn control-c. Thực hiện trên Mingw32.

Điều làm tôi bối rối là khi nhấn phím điều khiển c. Chương trình hiển thị rác trước khi thoát.

Ví dụ:

 Chào mừng bạn đến với Chương trình Ý tưởng.
gõ h để có menu trợ giúp.
meep
'meep' không phải là lệnh được công nhận.
*ctrl-c*
'meep' không phải là lệnh được công nhận.

Mã cho chương trình này là:

#include 

int main(int argc, char **argv)
{
đặt(" Chào mừng đến với Chương trình Ý tưởng.");
put(" gõ h để xem menu trợ giúp.");

trong khi (1) {
thông điệp char[200];
printf(" ");
được (tin nhắn);
if (strcmp(msg, "h") == 0) {
đặt("");
đặt("-menu trợ giúp-");
đặt("h: hiển thị menu này");
đặt("----------");
} khác {
printf("'%s' không phải là lệnh được nhận dạng.\n", msg);
}
}

return 0;
}

Tôi muốn biết làm thế nào để ngăn nó in rác trong trường hợp này và nếu có thể, hãy giải thích lý do tại sao điều này lại xảy ra.

Tôi biết đây là một câu hỏi ngu ngốc, nhưng bất kỳ trợ giúp nào cũng sẽ được đánh giá cao!


LƯU Ý/2022: Tôi đã xem lại chương trình cũ này sau khi nhận được thông báo và tìm thấy một số sai sót rõ ràng (một số sai sót rõ ràng và không đúng sự thật):

  1. Chương trình không#include Mặc dù sử dụng strcmp.
  2. Chương trình khôngsetvbuf(stdout, (char *)0, _IONBF, 0)cũng khôngxả rác , điều này làm cho đầu ra không nhất quán trên các thiết bị đầu cuối/ttys khác nhau.
  3. Điều quan trọng nhất là được Đối với tất cả các vấn đề tiềm ẩn, nó được coi là không được dùng nữa và thậm chí có thể bị xóa trong các trình biên dịch mới hơn.

Ngay cả với mã gốc, lỗi gốc cũng không xuất hiện trên máy hiện tại của tôi.

Đây là mã được cải thiện một chút mà không cần viết lại hoàn chỉnh:

#include 
#include

int main(int argc, char **argv)
{
setvbuf(stdout, (char *)0, _IONBF, 0);
đặt(" Chào mừng đến với Chương trình Ý tưởng.");
put(" gõ h để xem menu trợ giúp.");

vì (;;) {
thông điệp char[200];

printf(" ");
scanf("%200s", msg);

/* scanf LUÔN để lại "\n" trong stdin sau khi đọc.
{
int ch;

ch = getchar();
while ((ch != '\n') && (ch != EOF)) {
ch = getchar();
}
}

if (!strcmp(msg, "h")) {
đặt("");
đặt("-menu trợ giúp-");
đặt("h: hiển thị menu này");
đặt("----------");
} khác {
printf("'%s' không phải là lệnh được nhận dạng.\n", msg);
}
}

return 0;
}

câu trả lời hay nhất

Thay vào đó, bạn cần kiểm tra giá trị trả về của fgets, giá trị này sẽ trả về NULL nếu nhấn ctrl-c.

   trong khi (1) {
thông điệp char[200];
printf(" ");
if (fgets(msg,sizeof(msg),stdin) != NULL)
{
if (strcmp(tin nhắn, "h") == 0)
{
đặt("");
đặt("-menu trợ giúp-");
đặt("h: hiển thị menu này");
đặt("----------");
}
khác
{
printf("'%s' không phải là lệnh được nhận dạng.\n", msg);
}
}
}

Về việc kiểm soát c gây ra rác in, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/23326193/

28 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress