背景
C语言的字符串库:<string.h>
臭名昭著:它毫无作为字符串的自我修养。使用原生C语言解析文本是一件相当腌臜 的事情:在清晰的逻辑以外,还需要良好的耐心来hard code在使用python等语言时视作理所应当的低级字符串处理函数。更糟糕的是,在我这样的C初学者看来,GNU manual讲的不清不楚。这篇笔记总结通过阅读源码获得的<string.h>
函数用法。
char* strtok(char* s, const char* delim)
—— Python一个split函数搞定的事情,你怎么搞得这么复杂?
——分配内存太麻烦了,我帮你标好 \0
了,你从原始字符串上自取子字符串吧。
使用
不同于strdup
这样会自动分配堆内存的函数,strtok
不为子字符串分配额外内存。它改动传入的字符串:把delimiter的字节改成\0
。因此有这样几个注意点:
- 在使用这个函数之后,传入的字符串就废掉啦!传进去之前做好备份。
- 不可以对静态字符串使用该函数。否则SEGFAULT。
char str[] = "a=1";
char* delim = "=";
char* token = strtok(str, delim);
while (token != NULL) {
puts(token);
token = strtok(NULL, &delim);
}
源码分析 [link]
//strtok.c
char* strtok(char* s, const char* delim) {
static char* olds;
return __strtok_r(s, delim, &olds);
}
//strtok_r.c
char *__strtok_r (char *s, const char *delim, char **save_ptr) {
char* end;
if (s == NULL)
s = *save_ptr;
if (*s == '\0') {
*save_ptr = s;
return NULL