我被告知使用带参数的函数的最佳实践之一是执行参数验证。
因此对于字符串检查null或空等等。
我正在创建一个List,并为此创建一个接受整数值的节点。我正在检查INT_MIN
和INT_MAX
的值,但是根据我读到的int值总是在这之间。如果我传递一个long long val,在带有signature node* create(int val)
的被调用函数中 - value将被转换为int范围并落入其中。
问题:如果传递了long的val,是否有办法检测它并且不创建节点?目前它已创建
问题:对于标准int,我需要执行哪些其他参数检查来编写健壮的代码?
我的代码片段
long long vall = 88888888888888;
create(vall); // for such case I don't want node to be created
node* create(int val)
{
if (val <= INT_MIN || val >= INT_MAX)
{
printf(" values are out of range");
}
node *pnode = (node *)malloc(sizeof(node));
if(pnode == NULL)
{
printf(" node creation failed \n");
}
pnode->pnext = NULL;
pnode->val = val;
return pnode;
}
答案 0 :(得分:1)
如果传递
long
的val,是否有办法检测它并且不创建节点?
将功能签名更改为long
或long long
等
// declare/define function first
node* create(long long val);
long long vall = 88888888888888;
create(vall); // for such case I don't want node to be created
node* create(long long val) {
// if (val <= INT_MIN || val >= INT_MAX) {
if (val < INT_MIN || val > INT_MAX) {
fprintf(stderr, " %lld out of int range\n", val);
return NULL;
// Return or exit, do not continue with the following code
}
// node *pnode = (node *)malloc(sizeof(node));
// Suggest alternative
node *pnode = malloc(sizeof *pnode);
...
// Adding an explicit cast useful to quiet pedantic warnings
pnode->val = (int) val;
...
注意:使用原始代码时,许多启用了所有警告的编译器会警告以下(不知道vall
的值)作为范围的缩小。
node* create(int val)
long long vall = ...;
create(vall);
对于标准
int
我还需要执行哪些参数检查来编写健壮的代码?
没有,除非该函数只能使用int
的子范围。所有int
值都在[INT_MIN ... IN_MAX]
范围内。 @Eugene Sh.
答案 1 :(得分:1)
您可以创建另一个具有相同名称但不同参数列表的函数:
node* create(long long val);
如果传递的值为long long
,则此函数将运行,而不是node* create(int val);
。因此,当您通过long
作为参数传递时,可以通过创建另一个函数来处理这种情况。
关于你的第二个任务,我应该说,你不需要检查int
对INT_MIN
和INT_MAX
边界的价值,因为它会永远不会超出这些界限。 INT_MAX
和INT_MIN
是int
TYPE自身的实际界限。
根据您的需求(功能需求)检查int
值。
您需要检查NULL
的传递字符串,因为如果您尝试访问此类字符串,您的程序将崩溃。但是,当您传递int
值时,无论如何都会有一个指定的值。