bentocaffe 2012-01-08
代码如下:
char strbuf[] = "Hello" // 等价于 char strbuf[] = {'H', 'e', 'l', 'l', 'o', '\0'}
代码如下:
size_t strlen_a(const char * str) { size_t length = 0; while (*str++ ) ++length; return length; }
好,我们再来看为什么ASP/VBScript中保留了这个特性,我们知道VBScript是VB(Visual Basic)的一个子集,VB是什么,VB是做Windows应用程序开发的,说到Windows应用程序开发那么就可能会调用到Windows系统的API,而这些API函数则大多是用C语言编写的,很明显为了VB能够兼容这些API,必然字符串要引入CHR(0)字符也就是vbNullChar,同时也要有C语言字符串处理的特性,就是遇到CHR(0)就标识着字符串结束,无论接下来是什么内容,最经典的利用CHR(0)字符的WinAPI函数调用就是GetLogicalDriveStrings ,这个API获取的驱动器字符串就类似于c:\<null>d:\<null><null>,每两个路径之间都间隔一个 null-terminated,也就是CHR(0),所以需要特殊处理,如果说VB不支持CHR(0)字符,那么这个API就用不了了,VB的应用程序编写就大打折扣。不过特别的是VB的子集VBScript保留了这个特性,目前我不太清楚在VBScript脚本中Null字符是否有必要,但是这给我们脚本编写有其是ASP带来了一定的麻烦,甚至是安全隐患。
比如说这样一个函数用来取文件扩展名:
代码如下:
' 该函数仅供演示,请勿用于生产环境 Function GetFileExtensionName(filename) Dim lastdotpos lastdotpos = InstrRev(filename, ".") GetFileExtensionName = Right(filename, Len(filename) - lastdotpos) End Function
代码如下:
Function filterFileName(fileName) filterFileName = Replace(fileName, vbNullChar, "") End Function
代码如下:
Function IsAcceptableFileName(fileName) Set objRegExp = New RegExp objRegExp.IgnoreCase = True objRegExp.Global = False objRegExp.Pattern = _ "^(?!^(PRN|AUX|CLOCK\$|CONFIG\$|" & _ "NUL|CON|COM\d|LPT\d|\..*)" & _ "(\..+)?$)[^\x00-\x1f\\?*:\"";|/]+$" IsAcceptableFileName = objRegExp.Test(fileName) Set objRegExp = Nothing End Function