所以,我是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)检查?
答案 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