如何在C中正确获得y / n输入

时间:2018-01-25 14:57:38

标签: c stdin getchar

所以,我是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"或者"无论什么"第一个getchar仍然捕获" y"和" n"并将它传递给主要。 我想拥有它,以便用户输入" y"或" n"没有别的。 我可以尝试抛弃getchar并切换到用于捕获的fgets和用于解析的sscanf,这是我更喜欢获取字符串的方式,但是,不知道,它只是一个字符,我宁愿不要过于复杂化。

有没有办法在用户输入后扫描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;
    }
}

它似乎正在做我需要它做的事情,还有其他我应该调整的东西吗?标准输入的fgets是否需要if(fgets(...)!= NULL)检查?

1 个答案:

答案 0 :(得分:1)

此解决方案有什么问题:

#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);
  }
}

那不完全&#34;过于复杂&#34;

仍有改进的余地,例如这里根本没有处理EOF条件。

执行示例:

abc
def
y
User choice: y
n
User choice: n
yes
User choice: y
no
User choice: n
noooo
User choice: n