函數定義
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)