我想在C程序中创建一个接受单个字符的简单菜单。菜单将如下:
如果用户输入'1','s'或'S',程序将打印“Hello”并再次提示输入 否则,如果用户输入“2”,E或“E”,则程序结束。 否则它应该打印“无效输入”并再次提示。
我能够创建程序,但问题是当用户输入12,13,14,15,16 .....所以从1开始,它显示Hello和其他选项相同。
我的代码是:
#include <stdio.h>
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');
}
答案 0 :(得分:3)
如果您只想接收一个字符,请考虑替换 getchar()函数的scanf()函数:
printf("Enter your selection from the number or character noted above: ");
selection = getchar();
答案 1 :(得分:2)
您可以使用strlen(它是标准C库的一部分)来检查scanf返回的字符串的长度,并拒绝超过一个字符的条目:
if (strlen(selection) > 1)
{
printf("Invalid selection.");
}
或者,我认为你可以使用getchar()只接受用户的一个字符,这意味着他们不必按Enter键。
答案 2 :(得分:1)
如前所述,如果您只想要一个字符,则应使用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'
会做同样的事情),您可以转换{在selection
- 阻止或if
之前使用switch
阻止{1}}大写。此外,这只是一个样式建议,不要使用toupper()
作为退出标志。一般做法是使用i
和i
之类的东西作为计数器或索引 - 您可以使用类似j
或quit_now
的内容,这样可以更准确地传达变量的含义。< / p>