【发布时间】:2015-09-04 09:27:16
【问题描述】:
strtok_r 在解析时将空字符放入输入字符串的不同位置。只有在strtok_r 返回NULL 后才会恢复原始字符串。
如果我需要在长字符串开头附近的某处提取标记怎么办?如果我离开循环,输入字符串仍然断开。我可以尝试手动恢复分隔符,但我不知道它是否是最后一个标记。
问题是 saveptr 值没有记录。
void extract_nth_token(char *res, size_t reslen, char *str, const char *delim, int n) {
int i;
char *token;
char *save_ptr;
token = strtok_r(str, delim, &save_ptr);
for(i = 0; token != NULL; i++) {
token = strtok_r(NULL, delim, &save_ptr);
if (i == n) {
snprintf(res, reslen, "%s", token);
/* token[strlen(token)] = delim[0]; */
/* break; */
}
}
}
【问题讨论】:
-
The problem is that saveptr value is not documented.你在找什么样的value? -
复制字符串并使用它。
-
@SouravGhosh 告诉我它是否是最后一个令牌的值
-
@basin
save_ptr是一个不透明的对象,它用于保存令牌解析器的内部状态。它与判断它是否是最后一个令牌无关。 -
这看起来像是一个 XY 问题。恕我直言,最好的方法是避免使用 strtok() 和 strtok_r(),并使用手工步进器解析字符串,可能使用 strstr()、strchr()、strspn() 和 strcspn()。
标签: c performance tokenize strtok