当我从387
的第shell.c
行开始遇到此函数时,我正在浏览SQLite源代码。
源代码:https://www.sqlite.org/download.html
有问题的功能:
/*
** Determines if a string is a number of not.
*/
static int isNumber(const char *z, int *realnum){
if( *z=='-' || *z=='+' ) z++;
if( !IsDigit(*z) ){
return 0;
}
z++;
if( realnum ) *realnum = 0;
while( IsDigit(*z) ){ z++; }
if( *z=='.' ){
z++;
if( !IsDigit(*z) ) return 0;
while( IsDigit(*z) ){ z++; }
if( realnum ) *realnum = 1;
}
if( *z=='e' || *z=='E' ){
z++;
if( *z=='+' || *z=='-' ) z++;
if( !IsDigit(*z) ) return 0;
while( IsDigit(*z) ){ z++; }
if( realnum ) *realnum = 1;
}
return *z==0;
}
注意:IsDigit是一个宏,它将无符号字符提供给ctype中定义的isdigit。
#define IsDigit(X) isdigit((unsigned char)X)
函数和指针的使用对我来说很有意义,然而,前两行让我相信它们可能会根据我的理解被不恰当地使用。
他们使用指针算法来改变字符串。
if( *z=='-' || *z=='+' ) z++;
如果指针第一个位置的字符是' - '或者' +',将指针移到一个位置。但是,如果传入函数的字符串只有一个恰好是' - '的字符,则似乎没有考虑到这一点。或' +'符号。
if( !IsDigit(*z) ){
当' z'被取消引用,不是这个被破坏/非法的内存访问,因为它超出指针的范围,或者是否有一些指针算法在幕后停止发生这种情况?
答案 0 :(得分:1)
不,C字符串应该以null结尾。
如果传递的字符串只包含-
或+
字符,z
指针将在递增后指向空终止符,IsDigit(*z)
将等效到IsDigit(0)
,评估为false
并返回0。