我试图将防御性编程作为整数输入,但如果输入一个字符,程序将进入无限循环。 然后我切换到输入作为一个字符,但它做了两次循环。一次用于错误的字符,一次用于行结束击键。
有没有办法获得循环,只需一次?
代码:
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;
}
答案 0 :(得分:2)
使用scanf(" %c", &choice)
使其跳过空格,否则在拾取字符后您的换行符将保留在标准输入中,并且将在下一次scanf调用中读取。说明符之前的空格意味着它将匹配任何类型的空白字符(空格,制表符和返回)。
答案 1 :(得分:2)
对于防御性编程(究竟是什么意思),我根本不会使用scanf
,因此很容易犯错误。
相反,使用fgets
读取输入行,然后根据需要解析输入行,然后使用修剪,自定义解析代码或可能sscanf
,可能在经过一些验证后。
此外,您最好始终检查任何*scanf
函数的返回值。检查两者的实际错误以及实际扫描的项目数。