即使大小写不匹配,菜单也会打印两次并默认运行
Menu prints twice and default runs even when case doesn't match
我正在尝试向用户显示一个菜单并允许他们从选项中进行选择。它处于 while 循环中,因为它必须迭代直到选择选项“e”以退出程序。如果用户输入不被接受的值,我将“默认”选项作为故障保护。无论我做什么,默认情况下总是 运行s 并且菜单总是在代码的初始 运行 之后出现两次。
我已经尝试将“getchar()”更改为 scanf,但它仍然会产生相同的重复输出。我也尝试完全取消开关,但使用 if/then 语句得到相同的结果。我附上了我的完整代码,非常感谢您的帮助!!
#include <stdio.h>
#include <stdlib.h>
// function for the menu
char menu() {
printf("Please select from the following menu: \n");
// setting up the menu from here
printf("a. input the data files location \n");
printf("b. enter the time interval \n");
printf("c. process and display the US Life Expectancy Data \n");
printf("d. process and display the Statistics of All Data \n");
printf("e. exit the program \n");
}
char options(char choice) {
switch (choice) {
case 'a':
printf("choice a\n");
break;
case 'b':
printf("choice b\n");
break;
case 'c':
printf("choice c\n");
break;
case 'd':
printf("choice d\n");
break;
case 'e':
break;
default: // default when none of the cases are matched
printf("Invalid input\n");
break;
}
}
// main function
int main(void) {
char choice;
do {
menu();
while ((choice = getchar()) == "\n") {};
if (choice == EOF) {
exit(1);
}
options(choice);
} while (choice != 'e');
}
问题是您的代码不处理换行符。换句话说,当您键入 a
后跟 ENTER 时,您的代码实际上会收到两个字符。 'a'
和 '\n'
。因此菜单将被打印两次并且你得到一个“无效输入”。
快速修复可能是:
choice = getchar(); --> while ((choice = getchar()) == '\n') {};
就是说,您应该将 choice
更改为 int
并执行以下操作:
int choice;
....
....
while ((choice = getchar()) == '\n') {};
if (choice == EOF)
{
// Fatal input error
exit(1);
}
最后,将 choice
作为全局变量是个坏主意。而是将其放入 main
并将其作为参数传递给函数 options
。但不要将它传递给 menu
。也一样:
char options() { --> char options(int choice) {
和
int main(void) {
int choice;
do {
menu();
while ((choice = getchar()) == '\n') {}; // ignore newlines
if (choice == EOF)
{
// Fatal input error
exit(1);
}
options(choice);
} while (choice != 'e');
}
我正在尝试向用户显示一个菜单并允许他们从选项中进行选择。它处于 while 循环中,因为它必须迭代直到选择选项“e”以退出程序。如果用户输入不被接受的值,我将“默认”选项作为故障保护。无论我做什么,默认情况下总是 运行s 并且菜单总是在代码的初始 运行 之后出现两次。 我已经尝试将“getchar()”更改为 scanf,但它仍然会产生相同的重复输出。我也尝试完全取消开关,但使用 if/then 语句得到相同的结果。我附上了我的完整代码,非常感谢您的帮助!!
#include <stdio.h>
#include <stdlib.h>
// function for the menu
char menu() {
printf("Please select from the following menu: \n");
// setting up the menu from here
printf("a. input the data files location \n");
printf("b. enter the time interval \n");
printf("c. process and display the US Life Expectancy Data \n");
printf("d. process and display the Statistics of All Data \n");
printf("e. exit the program \n");
}
char options(char choice) {
switch (choice) {
case 'a':
printf("choice a\n");
break;
case 'b':
printf("choice b\n");
break;
case 'c':
printf("choice c\n");
break;
case 'd':
printf("choice d\n");
break;
case 'e':
break;
default: // default when none of the cases are matched
printf("Invalid input\n");
break;
}
}
// main function
int main(void) {
char choice;
do {
menu();
while ((choice = getchar()) == "\n") {};
if (choice == EOF) {
exit(1);
}
options(choice);
} while (choice != 'e');
}
问题是您的代码不处理换行符。换句话说,当您键入 a
后跟 ENTER 时,您的代码实际上会收到两个字符。 'a'
和 '\n'
。因此菜单将被打印两次并且你得到一个“无效输入”。
快速修复可能是:
choice = getchar(); --> while ((choice = getchar()) == '\n') {};
就是说,您应该将 choice
更改为 int
并执行以下操作:
int choice;
....
....
while ((choice = getchar()) == '\n') {};
if (choice == EOF)
{
// Fatal input error
exit(1);
}
最后,将 choice
作为全局变量是个坏主意。而是将其放入 main
并将其作为参数传递给函数 options
。但不要将它传递给 menu
。也一样:
char options() { --> char options(int choice) {
和
int main(void) {
int choice;
do {
menu();
while ((choice = getchar()) == '\n') {}; // ignore newlines
if (choice == EOF)
{
// Fatal input error
exit(1);
}
options(choice);
} while (choice != 'e');
}