strtok跳过分隔符的实现更贴近哪种方案?性能相关问询
两个ignore_delims函数实现对比
先给出两种跳过分隔符的函数实现:
char* ignore_delims_v1(char* input, char* delims) { while (in(*input, delims)) ++input; return input; } char* ignore_delims_v2(char* input, char* delims) { ssize_t len = strlen(delims); do { for (int i = 0; i < len; ++i) input = skip_char(input, delims[i]); } while(in(*input, delims)); return input; }
其中辅助函数的作用:
in(char c, char* test):当字符c存在于test字符串中时返回1,内部通过逐字符比对实现skip_char(char* str, char c):返回字符串str中第一个不等于c的字符位置
性能假设与场景分析
若满足大多数场景下,分隔多个token的字符序列仅包含单一类型字符这一前提,ignore_delims_v2的统计性能会更优。
常见场景(符合假设)
这类场景中,字段间的分隔符序列只有单一类型字符:
field1 field2\t\tfield3 field4\n field1 field2\tfield3\t\t field4\n
少见场景(不符合假设)
这类场景的分隔序列包含多种不同字符:
field1 \t field2\t\t field3 field4 \n \tfield1 field2\tfield3 \tfield4\n
多数非自然语言文本(如表格、命令输出等常见解析场景)更贴近第一种常见场景。此时ignore_delims_v2能一次性跳过连续的相同分隔符,大幅减少字符检查次数,性能远优于ignore_delims_v1。
问题解答:strtok的实现更贴近哪一种?
标准库中strtok的实现更贴近第一种方案(ignore_delims_v1)。
它的核心逻辑是逐个字符检查当前位置是否属于分隔符集合:每遍历一个字符,就判断它是否是分隔符,如果是则继续向后移动指针,直到找到第一个非分隔符字符为止。这种逐字符校验的逻辑和ignore_delims_v1的循环逻辑完全一致,并没有采用ignore_delims_v2中批量跳过单一连续分隔符的策略。
内容的提问来源于stack exchange,提问作者ABu
相关产品推荐
相关产品推荐

