[英]How to properly get a y/n input in C
因此,我是一名C语言和编程新手,我试图编写一个函数来抽象使用很多选择的程序中的y / n选择,到目前为止,我的选择是这样的:
void chooser (char *choice)
{
while (1)
{
*choice='\0';
*choice=getchar();
while(getchar()!='\n');
if(*choice == 'y' || *choice == 'n')
break;
}
}
第二个getchar在stdin中消耗了过多的输入,因此它不会受到用户键入乱码的影响。
唯一的问题是,如果我键入“ ywhatever”或“ nwhatever”,则第一个getchar仍将捕获“ y”和“ n”并将其传递给主函数。 我想要它,以便用户必须键入“ y”或“ n”,而无需输入其他任何内容。 我可以尝试放弃getchar并切换到fgets进行捕获,并切换到sscanf进行解析,这是我更喜欢获取字符串的方式,但是dunno,它只是一个字符,我不希望过于复杂。
用户输入后,是否可以扫描stdin以查看其是否包含多个字母字符?
编辑:最后,我为此:
int chooser ()
{
char buffer[MAXIN];
while (1)
{
printf("y/n: ");
if (fgets(buffer, sizeof(buffer), stdin)!=NULL)
{
if (buffer[0] == 'y' || buffer[0] == 'n')
{
if (buffer[1]=='\n')
{
break;
}
else
{
while(getchar()!='\n');
}
}
}
}
if (buffer[0]=='y')
{
return 1;
}
if (buffer[0]=='n')
{
return 0;
}
}
它似乎完全可以满足我的需要,还有什么我应该调整的吗? 来自标准输入的fget是否需要if(fgets(...)!= NULL)检查?
此解决方案出了什么问题:
#include <stdio.h>
void chooser(char *choice)
{
char buffer[200];
while (1)
{
fgets(buffer, sizeof(buffer), stdin);
if (buffer[0] == 'y' || buffer[0] == 'n')
break;
}
*choice = buffer[0];
}
int main(int argc, char **argv)
{
while (1)
{
char yn;
chooser(&yn);
if (yn == 'y' || yn == 'n')
printf("User choice: %c\n", yn);
}
}
这并非完全“过于复杂”
仍有改进的空间,例如,此处根本没有处理EOF条件。
执行示例:
abc
def
y
User choice: y
n
User choice: n
yes
User choice: y
no
User choice: n
noooo
User choice: n
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.