正确的使用strtok_r
方法如下:
char* str = strdup(string);
char* save;
char* ptr = strtok_r(str, delim, &save);
while(ptr) {
puts(ptr);
ptr = strtok_r(NULL, delim, &save);
}
当试图检查实际存储的内容时save
,我发现它只是未解析字符串的其余部分。所以我试图让第二个调用看起来像第一个,并编写了一个包装器,如下所示。
char* as_tokens(char** str, const char* const delim) {
return strtok_r(NULL, delim, str);
}
这可以像下面这样使用,它不那么冗长。我们不必区分第一次呼叫和休息。
char* str = strdup(string);
char* ptr;
while(ptr = as_tokens(&str, delim))
puts(ptr);
这种方法有什么缺点吗?我是否导致任何未定义的行为?我尝试了一些极端情况,两种方法的工作方式相似。
在线编译器:https ://wandbox.org/permlink/rkGiwXOUTzqrbMpP
PS 为简洁起见忽略内存泄漏。
更新
已经存在一个与我的as_tokens
: strsep几乎相似的函数。在有连续分隔符的情况下有所不同。strsep
返回一个空字符串,而as_tokens
(即 strtok_r)将它们视为一个。