Bạn đã trả lời câu hỏi của chính mình; bạn phải đối phó với nhân vật mới bằng cách nào đó.
Có một số tùy chọn. Nếu tùy chọn trình đơn của bạn được số, bạn có thể sử dụng scanf()
để đọc trong một giá trị số nguyên và chuyển đổi dựa trên rằng:
printf("Pick an option: ");
fflush(stdout);
scanf("%d", &option);
switch(option)
{
case 0 : do_something(); break;
case 1 : do_something_else(); break;
...
default: bad_option(); break;
}
Ưu điểm của tùy chọn này là sự xác định %d
chuyển đổi bỏ qua đối với bất kỳ khoảng trắng hàng đầu, bao gồm các ký tự dòng mới, do đó bạn không phải lo lắng về việc chưa đọc bất kỳ dòng chưa đọc nào (trên thực tế, hầu hết các trình chuyển đổi bỏ qua khoảng trắng đầu tiên; %c
không làm cho nó hoạt động rất giống như getchar()
).
Điểm bất lợi của tùy chọn này là nếu ai đó đánh dấu ngón tay vào một ký tự không phải chữ số trong đầu vào, nó sẽ không được đọc với thông số chuyển đổi %d
và sẽ bị kẹt trong luồng đầu vào cho đến khi gọi đến getchar()
hoặc scanf()
với số %s
hoặc %c
quy tắc chuyển đổi.
Tùy chọn tốt hơn là đọc tất cả đầu vào dưới dạng ký tự chuỗi sử dụng fgets()
, sau đó phân tích cú pháp và xác thực khi cần thiết.
/**
* Prints a prompt to stdout and reads an input response, writing
* the input value to option.
*
* @param prompt [in] - prompt written to stdout
* @param option [out] - option entered by user
*
* @return - 1 on success, 0 on failure. If return value is 0, then option
* is not changed.
*/
int getOption(const char *prompt, char *option)
{
char input[3]; // option char + newline + 0 terminator
int result = 0;
printf("%s: ", prompt);
fflush(stdout);
if (fgets(input, sizeof input, stdin))
{
/**
* Search for a newline character in the input buffer; if it's not
* present, then the user entered more characters than the input buffer
* can store. Reject the input, and continue to read from stdin until
* we see a newline character; that way we don't leave junk in the
* input stream to mess up a future read.
*/
char *newline = strchr(input, '\n');
if (!newline)
{
printf("Input string is too long and will be rejected\n");
/**
* Continue reading from stdin until we find the newline
* character
*/
while (!newline && fgets(input, sizeof input, stdin))
newline = strchr(input, '\n');
}
else
{
*option = input[0];
result = 1;
}
}
else
printf("Received error or EOF on read\n");
return result;
}
Có, đó là rất nhiều công việc để đọc trong một tùy chọn menu ngu ngốc và đó là phiên bản đơn giản. Chào mừng bạn đến với thế giới tuyệt vời của quá trình xử lý đầu vào tương tác trong C.
Tôi không được sử dụng chuỗi hoặc mảng char (công việc của khóa học) – SnapDragon