函数定义
redis
#include <string.h> char *strsep(char **stringp, const char *delim);
stringp是二级指针,即目标字符串首字符地址的地址。
函数
delim是分割符,由于是字符串格式的,函数会把字符串里的每隔字符都当作分割符号。
ui
2. 函数调用this
#include <string.h> #include <stdio.h> int main(int argc, char* argv[]) { char buf[] = "zhang-guang-rong,jet-li"; char *src = strdup(buf); char delim[] = "-,"; char* token; for(token=strsep(&src, delim); token!=NULL; token=strsep(&src, delim)){ printf("%s\n", token); } free(src); return 0; }
输出:spa
zhang guang rong jet li
3. 函数解析指针
以上述为例,strsep以src="zhang-guang-rong,jet-li"为源字符串。code
char* begin = *stringp;token
找到第一个包含在delim="-,"的分割符,即zhang后面的'-'。由char *end指向它。字符串
end指向的分隔符重写为'\0'。 # *end='\0'。
string
而后修改*stringp的指向为end+1,即"guang-rong,jet-li"。
函数返回begin。
/** Copyright (C) 1992, 93, 96, 97, 98, 99, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include <string.h> #undef __strsep #undef strsep char * __strsep (char **stringp, const char *delim) { char *begin, *end; begin = *stringp; if (begin == NULL) return NULL; /** A frequent case is when the delimiter string contains only one character. Here we don't need to call the expensive `strpbrk' function and instead work using `strchr'. */ if (delim[0] == '\0' || delim[1] == '\0') { char ch = delim[0]; if (ch == '\0') end = NULL; else { if (*begin == ch) end = begin; else if (*begin == '\0') end = NULL; else end = strchr (begin + 1, ch); } } else /** Find the end of the token. */ end = strpbrk (begin, delim); if (end) { /** Terminate the token and set *STRINGP past NUL character. */ *end++ = '\0'; *stringp = end; } else /** No more delimiters; this is the last token. */ *stringp = NULL; return begin; } weak_alias (__strsep, strsep) strong_alias (__strsep, __strsep_g) libc_hidden_def (__strsep_g)