strtok(NULL, "")的用法是否符合ISO C标准且具备可移植性?
strtok(NULL, "")的用法是否符合ISO C标准且具备可移植性?
好问题!很多人用strtok的时候都会碰到这种“想直接捞走剩下所有内容”的场景,我来帮你把这个疑问理得明明白白。
首先,你当前的用法在glibc上能正常跑可不是运气好——它其实完全符合ISO C标准的定义,理论上在所有遵循C标准的库实现里都能正常工作。
我们直接看ISO C标准(比如C99、C11、C17)对strtok的明确规定:
strtok的第二个参数是由分隔符字符组成的字符串,空字符串就意味着“没有任何分隔符字符”。- 当你调用
strtok(NULL, "")时,函数会从上次暂停的位置开始搜索,因为找不到任何属于分隔符的字符(毕竟分隔符字符串是空的),所以它会把从当前位置到字符串末尾的所有内容当作一个完整的token返回,这完全契合标准里的逻辑。
给你再拆解下你的代码逻辑:
char buffer[] = "head:rest(with possibly more : delimiters)"; char* head = strtok(buffer, ":"); // 指向"head" char* rest = strtok(NULL, ""); // 指向"rest(with possibly more : delimiters)"
不过这里要提个小提醒:虽然标准允许这种用法,但你得注意strtok本身的线程不安全特性——它依赖内部的静态状态,多线程环境下建议用strtok_r或者strtok_s(C11的安全扩展),不过这和你问的空分隔符可移植性是两码事。
另外,极少数非常老旧的、不严格遵循C标准的库实现可能会有兼容问题,但现在主流的编译器(比如GCC、Clang、MSVC)的标准库都严格遵循规范,所以这个用法的可移植性是有保障的。
内容来源于stack exchange
相关产品推荐
相关产品推荐

