菜单上的防御性编程。我应该输入什么类型的输入?

时间:2013-03-05 19:21:20

标签: c defensive-programming

我试图将防御性编程作为整数输入,但如果输入一个字符,程序将进入无限循环。 然后我切换到输入作为一个字符,但它做了两次循环。一次用于错误的字符,一次用于行结束击键。

有没有办法获得循环,只需一次?

代码:

int main(int argc, char *argv[])
{
    char choice='5';
    while (choice != '1' && choice !='2' && choice !='3' && choice!='4' && choice!='0')
        {
             printf("Parakalw epilekste ena apo ta parakatw\n\n");
             printf("1.\tKafe 1.5 euro\n");
             printf("2.\tKafe me gala 1.8 euro\n");
             printf("3.\tSokolata 2.1euro\n");
             printf("4.\tSokolata me gala 2.4 euro\n");
             printf("0.\tExodos\n\n");
             printf("parakalw eisagete thn epilogh sas: ");
             scanf("%c",&choice);
        }
system("PAUSE");    
return 0;
}

2 个答案:

答案 0 :(得分:2)

使用scanf(" %c", &choice)使其跳过空格,否则在拾取字符后您的换行符将保留在标准输入中,并且将在下一次scanf调用中读取。说明符之前的空格意味着它将匹配任何类型的空白字符(空格,制表符和返回)。

答案 1 :(得分:2)

对于防御性编程(究竟是什么意思),我根本不会使用scanf,因此很容易犯错误。

相反,使用fgets读取输入行,然后根据需要解析输入行,然后使用修剪,自定义解析代码或可能sscanf,可能在经过一些验证后。

此外,您最好始终检查任何*scanf函数的返回值。检查两者的实际错误以及实际扫描的项目数。