在C语言中接受单个字符的菜单

我想在C程序中创建一个接受单个字符的简单菜单。 菜单将是这样的:

  1. [节目
  2. [出口

如果用户输入’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的退出标志。 通常的做法是使用ij类的东西作为计数器或索引 – 你可以使用quit_nowuser_done类的东西来更精确地传达变量的含义。