【问题标题】:defensive programming on a menu. what type of input should I have?菜单上的防御性编程。我应该有什么类型的输入?
【发布时间】:2013-03-05 19:21:19
【问题描述】:

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

有没有什么办法让循环一次?

代码:

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

【问题讨论】:

  • 为什么不用像int n; scanf ("%d",&n);这样的整数?
  • 如果 n = 任何字符而不是数字,它将进入无限循环
  • @NikolaosTsouktakos:那是因为 scanf 将无法读取数字,并且您的循环编写方式会不断尝试,永远使用相同的输入。

标签: c defensive-programming


【解决方案1】:

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

【讨论】:

  • 这种“防御性编程”重要吗?我应该进一步查找还是继续前进?
  • 检查用户输入的值是否有效总是好的。一种常见的方法是使用带有 switch 语句的循环来处理输入,并使用打印错误消息的默认情况。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多