2

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

有没有办法让循环,只有一次?

代码:

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;
}
4

2 回答 2

2

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

于 2013-03-05T19:24:09.017 回答
2

对于防御性编程(你到底是什么意思),我根本不会使用scanf,它很容易出错。

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

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

于 2013-03-05T19:54:46.460 回答