数组的下标是否可以为负数?在一般的教材中都会说这个会使得操作越界什么的,但在一些具体的实现中这个技巧有时候还是很给力的。
网上很多人说数组下标是不可以为负的,但一个经典的strsep源码中就使用了这个技巧。
下面是strsep的一个典型实现,这个函数是用来根据delim指向的字符串来分割stringp串的。
如果 *stringp 是 NULL,strsep() 函数返回 NULL 并什么也不做。
否则的话,在字符串 *stringp 里查找第一个记号,这些记号通过定义在 delim 里的分隔符分隔而来。
这个记号以空字符 '\0' 结尾(通过覆盖分隔符的方法实现)并且 *stringp 更新为指向记号之后位置。
在没有发现分隔符的情况下,记号就是整个字符串 *stringp,并把 *stringp 重置为 NULL。
下面的实现用一个简单的例子跑一般就很清楚了,例如stringp指向abcdef;delim指向d。
实现中一个令人振奋的是数组下标使用了-1
char *strsep(char **stringp, const char *delim) { register char *s; register const char *spanp; register int c, sc; char *tok; if ((s = *stringp) == NULL) return (NULL); for (tok = s;;) { c = *s++; spanp = delim; do { if ((sc = *spanp++) == c) { if (c == 0) s = NULL; else s[-1] = 0; //这个使用的很巧妙 *stringp = s; return (tok); } } while (sc != 0); } /* NOTREACHED */ }