如何在函数中检查C中的类型
我正在制作一个函数,它使用两个指向字符串的指针作为参数。只要传递有效的参数,它就可以正常工作。 我想知道如何检查这些指针是否有效,例如两个随机整数。我该怎么做如何在函数中检查C中的类型,c,string,function,pointers,arguments,C,String,Function,Pointers,Arguments,我正在制作一个函数,它使用两个指向字符串的指针作为参数。只要传递有效的参数,它就可以正常工作。 我想知道如何检查这些指针是否有效,例如两个随机整数。我该怎么做 char ** LCS ( char * s1, char * s2) //thats the function 在函数体中,选中: if ((s1==NULL) || (s2==NULL)) { /* Do something to indicate bad parameters */ } 在函数体中,选中: if ((
char ** LCS ( char * s1, char * s2) //thats the function
在函数体中,选中:
if ((s1==NULL) || (s2==NULL)) {
/* Do something to indicate bad parameters */
}
在函数体中,选中:
if ((s1==NULL) || (s2==NULL)) {
/* Do something to indicate bad parameters */
}
使用文档并遵循C座右铭:“相信程序员”
使用文档并遵循C座右铭:“相信程序员”
在C语言中,恐怕你必须小心,希望程序员知道该怎么做 在这种情况下,0(零,null,null)是函数的有效输入 通常情况下,您至少应该通过检查输入是否有效来保护函数 例如
char** LCS (char *s1, char *s2 )
{
if ( s1 == 0 )
return ...;
if ( s2 == 0 )
return ...;
if ( strlen( s1 ) == 0 )
return ...
/// do something ...
}
在C语言中,恐怕你必须小心,希望程序员知道该怎么做 在这种情况下,0(零,null,null)是函数的有效输入 通常情况下,您至少应该通过检查输入是否有效来保护函数 例如
char** LCS (char *s1, char *s2 )
{
if ( s1 == 0 )
return ...;
if ( s2 == 0 )
return ...;
if ( strlen( s1 ) == 0 )
return ...
/// do something ...
}
您最多只能检查NULL(0)。否则,没有标准的方法来判断非空指针值是否有效。可能存在一些特定于平台的黑客攻击,但一般来说,这个问题可以通过文档和良好的内存管理来解决 您最好检查NULL(0)。否则,没有标准的方法来判断非空指针值是否有效。可能存在一些特定于平台的黑客攻击,但一般来说,这个问题可以通过文档和良好的内存管理来解决 您可以使用这样的结构实现自己的类型检查。但您也可以使用带有适当类型检查的语言。:)
您可以使用这样的结构实现自己的类型检查。但您也可以使用带有适当类型检查的语言。:)
C的思想是围绕“程序员知道他在做什么”这一原则展开的。C如此轻量级和快速的一半原因是因为它不执行此类类型检查
如果你真的需要执行这样的检查,你最好在C++中使用引用(保证是非空的)而不是指针。
C的思想围绕着程序员知道他正在做什么的原理。因为它不执行此类类型检查
如果你真的需要执行这样的检查,你最好在C++中使用引用(它被保证是非空的)而不是指针。如果不允许,则应在函数的约定中禁止使用
NULL
参数,例如,在声明上方添加注释,说明它仅对有效的非NULL
参数有效。换句话说,任何使用函数的人都同意不提供NULL
参数;这是他们的责任,而不是你的责任
如果其中一个或两个参数都为NULL
,那么您需要决定函数在这种情况下的行为,并实现它。在这种情况下,您同意支持NULL
参数,并对其进行合理的处理,因此您有责任对此进行检查并采取相应的行动(例如,如果(s1==NULL))
如果您不能为NULL
参数想出任何合理的行为,那么使用第一个选项并完全禁止它们。如果您这样做,那么您的示例调用LCS(0,0)
违反合同(即当函数不同意接受指针时,传递NULL
指针),应删除。在更复杂的场景中,如果您从变量传递参数,并且这些变量有可能指向NULL
,那么您必须在调用LCS
之前进行检查,例如if(v1&&v2){LCS(v1,v2);}else{…}
要跟踪与此相关的可能错误,您可以使用assert
进行检查,例如:
#include <assert.h>
char **LCS (char *s1, char *s2) {
assert(s1);
assert(s2);
…
}
#包括
字符**LCS(字符*s1,字符*s2){
断言(s1);
断言(s2);
…
}
如果s1
或s2
为NULL
,这将导致程序退出,除非在包含assert.h
之前定义了NDEBUG
(在这种情况下,断言不起任何作用)。因此,断言是一种在开发过程中检查调用方是否没有向您提供NULL
参数的方法,但如果调用方提供了参数,则仍然是错误的
至于其他无效指针,您甚至无法真正可靠地检查,例如,无法知道调用方是否有一个非常奇怪的字符串,或者他们是否只是传递了错误的地址。这也是他们要避免的责任,而
LCS
应该简单地假设调用者提供了有效的数据。当然,如果您有额外的限制,例如参数字符串的最大长度,那么您必须向调用者明确这些限制(即,指定函数的契约,“此函数没有X[您作为LCS实现者的责任],[他们作为LCS用户的责任]”)。这适用于所有编程,例如,C标准规定了必须如何使用语言本身和标准库函数(例如,不能被零除,strcpy
的参数字符串不能重叠等)。有人用NULL
参数调用您的函数有意义吗?如果不允许,则应在函数的约定中禁止使用NULL
参数,例如,在声明上方添加注释,说明它仅对有效的非NULL
参数有效。换句话说,任何使用
#include <assert.h>
char **LCS (char *s1, char *s2) {
assert(s1);
assert(s2);
…
}