繁体   English   中英

如何在C中正确获取ay / n输入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM