如何在函数中检查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);
    …
}