输入验证:检查多个值

时间:2016-11-20 22:11:18

标签: c validation input

用户只有两个选择' a'或者' b',如果用户输入的不是' a'或者' b'错误消息应提示他们仅输入' a'或者' b'。

好的: 我输入了一封信' a'它绕过了while循环。

坏了: 当我进入' b'它没有绕过while循环?

有关解决这个问题的任何建议吗?

#include <stdio.h>
int main(void)
{
    char c;

    printf("enter a or b to make it out!\n");

    //loop if answer is NOT a or b
    while ((c = getchar() != 'a') && (c = getchar() != 'b'))
    {
        //let the user know there has been a problem!
        printf("That value is invalid");
        printf("\nPlease enter a or b:\n");
        fseek(stdin,0,SEEK_END);
    }

    printf("You made it out!");
    return 0;
}

2 个答案:

答案 0 :(得分:1)

每当你执行getchar()时,都会读取_different_字符。因此,您应该将while循环更改为

while (((c = getchar()) != 'a') && (c != 'b'))

否则,只要选中条件c = getchar() != 'b',c就会为\n

更重要的是,你应该将\n放在一边。因此,您可以在getchar()循环中添加另一个while,其返回值不需要使用。

答案 1 :(得分:1)

多个问题:

  • c = getchar() != 'a'不会将读取的字符存储到c中,它会读取并丢弃该字符,并将比较结果存储到c

  • 您应该测试读取的字符的值,而不是读取第二个字符。

  • 您还应检查文件的结尾,并使用int允许unsigned char的所有值和特殊值EOF

  • 倒回stdin以读取更多字节将不会产生您所期望的:要么成功又要重读相同的字节,否则可能会失败stdin无缓冲并绑定到设备

试试这个:

#include <stdio.h>

int main(void) {
    int c;

    printf("enter a or b to make it out!\n");

    //loop if answer is NOT a or b
    while ((c = getchar()) != EOF && c != 'a' && c != 'b') {
        //let the user know there has been a problem!
        printf("That value is invalid");
        printf("\nPlease enter a or b:\n");
    }
    printf("You made it out!\n");
    return 0;
}