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):
- Chương trình không
#include
Mặc dù sử dụng strcmp.
- Chương trình không
setvbuf(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.
- Đ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;
}
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);
}
}
}
Tôi là một lập trình viên xuất sắc, rất giỏi!