gpt4 book ai didi

c - 检查意外用户输入的方法

转载 作者:太空宇宙 更新时间:2023-11-04 06:56:17 25 4
gpt4 key购买 nike

我了解到,永远不要相信用户的输入。在处理它之前检查它已经成为一种习惯。我几乎总是使用那种类型的函数,并且经常想知道这两个版本之间是否存在差异

这是我的检查函数的一个简单示例:

版本 1

int checkASCII(char c) // Here we check, print error and return if it succeeded or not
{
if (!isascii(c))
{
fprintf(stderr, "Error. Not an ASCII character.\n.");
return 1;
}
if (!isdigit(c))
{
fprintf(stderr, "Error. Not a number.\n.");
return 1;
}
// potentially more checks
return 0;
}

int printASCIINumber() // So that here we just have to verify the success
{
char c;
c = getc(stdin);
if (checkASCII(c))
putc(c, stdout);
else return 1;
return 0;
}

版本 2

int checkASCII(char c) // Here we just check errors regardless of what failed
{
if (!isascii(c))
return 1;
if (!isdigit(c)
return 1;
... // potentially more checks
return 0;
}

int printASCIINumber() // And here we verify success and print a general error message
{
char c;
c = getc(stdin);
if (checkASCII(c))
putc(c, stdout);
else
{
fprintf(stderr, "Error. Please input an ASCII number.\n");
return 1;
}
return 0;
}

如果有任何目标的改进,我也不反对。谢谢。

最佳答案

一开始:您的返回值与您之后进行的检查不匹配。如果你认为结果是一个错误代码,0 表示成功,那么你必须通过 if(!checkASCII(c)) 进行测试- 如果您认为结果是一个 bool 值,那么您需要反转返回的值。在这种情况下,我建议包括 <stdbool.h> ,将返回类型更改为 bool并将函数重命名为 isASCII .这会使您的意图更加明显。

比较您的两个版本,我想说总体上没有一个比另一个更好——这取决于您的编程环境。

假设您正在编写一些通用库。那么我当然更喜欢变体 2,因为你不知道使用你的库的人是否需要控制台输出——或者控制台是否可用(linux 守护进程、windows 服务等)。无论出于何种原因,用户可能希望使用自己的日志记录工具...

另一方面,如果您编写一些仅在您的程序中使用的辅助函数,变体 1 会更方便:

  • 您可以直接在发生故障的函数中直接提供更细粒度的输出 - 无需在函数外部评估某些错误号或返回值(这可能是库函数提供有关错误原因的更多信息的方式) .
  • 这很方便,尤其是当您的检查函数被频繁调用时,能够依赖在您调用测试函数时已经完成的日志记录,这样您就可以继续编写代码。

关于c - 检查意外用户输入的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44049567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com