C中的输入验证(and循环)

C中的输入验证(and循环),c,validation,input,C,Validation,Input,我正在创建一个程序,它应该验证我输入的正确值,但不幸的是,我做错了什么。 如果答案为1或0,该程序需要检查输入值10次。否则它必须再次要求答复。当输入完成时,它应该通过printf显示正确的答案,但事实并非如此 我猜“开关盒”部分出了问题。谢谢你的帮助 我的代码: int main() { char a0, a1, a2, a3, a4, a5, a6, a7, a8, a9; char c = '0'; int a = 0, OK = 0, check = 0, valid_input =

我正在创建一个程序,它应该验证我输入的正确值,但不幸的是,我做错了什么。 如果答案为1或0,该程序需要检查输入值10次。否则它必须再次要求答复。当输入完成时,它应该通过printf显示正确的答案,但事实并非如此

我猜“开关盒”部分出了问题。谢谢你的帮助

我的代码:

int main()

{
char a0, a1, a2, a3, a4, a5, a6, a7, a8, a9;
char c = '0';
int a = 0, OK = 0, check = 0, valid_input = 0, a_ok;

printf("Fill in a value 1 or 0.\n\n");

while (a < 10)
{
while (valid_input == 0)
{
    printf("Fill in a%d: ", a);
    a_ok = scanf("%d", &OK);
    if (a_ok != 1)
    {
        scanf("%s", &c);
    }
    else if (OK <0 | OK >1)
    {
        do
        {
            while (check == 0)
            {
            printf("Fill in a%d: ", a);
            check = check +1;
            }
        c = getchar();
        }
        while (!isdigit(c));
        ungetc(c, stdin);
    }
    else
    valid_input = 1;
}
switch (a)
    {
    case 0:
    OK = a0;
    case 1:
    OK = a1;
    case 2:
    OK = a2;
    case 3:
    OK = a3;
    case 4:
    OK = a4;
    case 5:
    OK = a5;
    case 6:
    OK = a6;
    case 7:
    OK = a7;
    case 8:
    OK = a8;
    case 9:
    OK = a9;
    }
a = a +1;
}

/*
printf("Fill in a1: ");      **<--- WANT TO REMOVE THIS PART BY LOOP**
scanf("%d", &a1);
printf("\nFill in a2: ");
scanf("%d", &a2);
printf("\nFill in a3: ");
scanf("%d", &a3);
printf("Fill in a4: ");
scanf("%d", &a4);
printf("\nFill in a5: ");
scanf("%d", &a5);
printf("Fill in a6: ");
scanf("%d", &a6);
printf("\nFill in a7: ");
scanf("%d", &a7);
printf("\nFill in a8: ");
scanf("%d", &a8);
printf("Fill in a9: ");
scanf("%d", &a9);
*/

printf("\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d", a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);

getch();
return(0);
}
intmain()
{
字符a0、a1、a2、a3、a4、a5、a6、a7、a8、a9;
字符c='0';
int a=0,OK=0,check=0,valid\u input=0,a\u OK;
printf(“填写值1或0。\n\n”);
而(a<10)
{
while(有效的_输入==0)
{
printf(“填写%d:,a”);
a_ok=scanf(“%d”&ok);
如果(a_ok!=1)
{
scanf(“%s”、&c);
}
否则,如果(确定1)
{
做
{
while(检查==0)
{
printf(“填写%d:,a”);
检查=检查+1;
}
c=getchar();
}
而(!isdigit(c));
ungetc(c、stdin);
}
其他的
有效_输入=1;
}
开关(a)
{
案例0:
OK=a0;
案例1:
OK=a1;
案例2:
OK=a2;
案例3:
OK=a3;
案例4:
OK=a4;
案例5:
OK=a5;
案例6:
OK=a6;
案例7:
OK=a7;
案例8:
OK=a8;
案例9:
OK=a9;
}
a=a+1;
}
/*

printf(“填写a1:”;***在开关的每种情况下,您都忘记了
break
语句:

case 0:
    OK = a0;
    break;
case 1:
    OK = a1;
    break;
/* etc. */
此外,如果
语句错误,则此

if (OK <0 | OK >1)
只是看起来不对。这相当于:

while (!isdigit(c))
{
}
这意味着当
isdigit(c)==0
时,它是一个无限循环,当
isdigit(c)!=0
时,它什么也不做。也许你想写这个:

while (!isdigit(c)) {
    ungetc(c, stdin);
}
但即便如此,您仍将在无限循环中将同一个字符推回到
stdin

这也是错误的:

scanf("%s", &c);
c
是一个
char
变量,但您告诉scanf()读取一个字符串

这不是一个错误,但您可能应该使用数组,而不是10个单独的变量:

char val[10];
因此,不是:

a0 a1 ... a9
您将有:

val[0] val[1] ... val[9]

无论如何,这个程序非常糟糕。如果你刚开始学习C,我建议你从头开始,多加注意。

我建议为aXHaha使用数组是的,我刚开始学习C。很抱歉我的代码。但是谢谢你的帮助!我们都在那里。请确保你真正理解所提出的建议,n不要只是应用它们。理解实际的错误是最重要的方面。
val[0] val[1] ... val[9]