在C语言中接受单个字符的菜单
我想在C程序中创建一个接受单个字符的简单菜单。 菜单将是这样的:
- [节目
- [出口
如果用户输入’1’,’s’或’S’,程序将打印“Hello”并再次提示输入,如果用户输入’2’,E或’E’程序结束。 否则它应该打印“无效输入”并再次提示。
我能够创建程序,但问题是当用户输入12,13,14,15,16 …..所以从1开始,它显示Hello和其他选项相同。
我的代码是:
#include void clearBuffer(); int main() { int i = 0; char selection; do { printf("\t1. [S]how\n"); printf("\t2. [E]xit\n"); printf("Enter your selection from the number or character noted above: "); scanf("%s", &selection); clearBuffer(); if (selection == '1' || selection == 's' || selection == 'S') printf("Hello"); else if (selection == '2' || selection == 'E' || selection == 'x') i = 0; } while(i != 0); } void clearBuffer() { while(getchar() != '\n'); }
您可以使用strlen (它是标准C库的一部分)来检查scanf返回的字符串的长度,并拒绝长于一个字符的条目:
if (strlen(selection) > 1) { printf("Invalid selection."); }
或者,我认为你可以使用getchar()只接受用户的一个字符,这意味着他们不必按Enter键。
如果您只接收一个字符,请考虑替换getchar()函数的scanf ()函数:
printf("Enter your selection from the number or character noted above: "); selection = getchar();
如前所述,如果只需要一个字符,则应使用getchar()
。 如果你仍然想要使用scanf()
,无论出于何种原因,正确的格式是"%c"
,而不是"%s"
。
我还建议,如果你正在寻找一个单个字符, if
块看起来有点“忙”(阅读,尴尬)……一个开关将是一个更干净,更优雅的方式(恕我直言)。
/* something like this ... */ switch ( selection ) { case '1': case 's': case 'S': printf ( "Hello\n" ); break; case '2': case 'e': case 'E': i = 0; break; }
其他几件事……如果你不关心正在阅读的字符的情况(即's'
和'S'
将做同样的事情),你可以在if
block之前将selection
转换为大写或者使用toupper()
switch
-block。 此外,这只是一个风格建议,不要使用i
的退出标志。 通常的做法是使用i
和j
类的东西作为计数器或索引 – 你可以使用quit_now
或user_done
类的东西来更精确地传达变量的含义。