首先,我将指出一个冗余代码。
这个 if 语句
if ((token != NULL) && (token[0] == '\0')) {
表情毫无意义,因为token
永远不能等于NULL
. token
main 中被声明为字符数组。所以你可以写
if ( token[0] == '\0') {
也在该语句的字符串文字中
strcpy(token, "./\0");
显式终止零字符'\0'
是多余的。你可以只写
strcpy(token, "./");
至于你的问题。
功能splitter
提取字符序列,直到字符delimiter
遇到并将其存储在数组中token
,
while (*str && (delimiter != *str)){
*token++ = *str;
str++;
}
但结果序列并不代表字符串。它应以终止零字符结束\0
和这个声明
*token = '\0';
将终止零字符附加到存储在数组中的提取序列的末尾token
.
至于这个说法
if (delimiter == *str)
str++;
那么如果它不是字符串的结尾str
(也就是说,如果当前字符*str
不是终止零字符 '\0';如果它等于delimiter
那么它不是终止零字符)然后是指针str
递增并从函数返回,以允许调用者在下一次调用函数时继续处理下一个位置的字符串。
所以最初你有
const char *env = "/bin:/sbin:::/usr/bin";
该函数复制字符/bin
附加零字符'\0'
这是数组标记的字符串“/bin”。调用此函数后,函数返回的指针将指向子字符串
"/sbin:::/usr/bin"
因为前面的字符':'
被该语句跳过
if (delimiter == *str)
str++;
函数内。