在c的库中有按字符拆分的函数
先写两个库中的函数,在读取时需要用到的。
extern
char
*
strpbrk
(
const
char
*s1,
const
char
*s2);
char
*
strpbrk
(
const
char
* cs,
const
char
* ct)
{
const
char
*sc1,*sc2;
for
( sc1 = cs; *sc1 !=
'\0'
; ++sc1)
{
for
( sc2 = ct; *sc2 !=
'\0'
; ++sc2)
{
if
(*sc1 == *sc2)
{
return
(
char
*) sc1;
}
}
}
return
NULL;
}
int
strspn
(
const
char
*s,
const
char
*accept)
{
const
char
*p;
const
char
*a;
int
count = 0;
for
(p = s; *p !=
'\0'
; ++p)
{
for
(a = accept; *a !=
'\0'
; ++a)
{
if
(*p == *a)
{
break
;
}
}
//里面的<a target="_blank" href="/subview/1042560/1042560.htm">for循环</a>到此为止
if
(*a ==
'\0'
)
{
return
count;
}
++count;
}
//外面的for循环到此为止
return
count;
}
这个就是按字符拆分函数
strtok_r(在windows中是不存在这个函数的,只有linux中有)
If S is NULL, the saved pointer in SAVE_PTR is used as
the next starting point. For example:
char s[] = "-abc-=-def";
char *sp;
x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
x = strtok_r(NULL, "=", &sp); // x = NULL
// s = "abc\0-def\0"
*/
char *strtok_r(char *s, const char *delim, char **save_ptr) {
char *token;
if (s == NULL) s = *save_ptr;
/* Scan leading delimiters. */
s += strspn(s, delim);
if (*s == '\0')
return NULL;
/* Find the end of the token. */
token = s;
s = strpbrk(token, delim);
if (s == NULL)
/* This token finishes the string. */
*save_ptr = strchr(token, '\0');
else {
/* Terminate the token and make *SAVE_PTR point past it. */
*s = '\0';
*save_ptr = s + 1;
}
return token;
}
char *strtok(char *s, const char *delim)
{
static char *last;
return strtok_r(s, delim, &last);
}
以上的函数只能实现单字符的拆分
然后我们把strpbrk,strtok_r改一下。
char * mystrpbrk(const char * cs,const char * ct)
{
const char *sc1,*sc2, *sc3;
for( sc1 = cs; *sc1 != '\0'; ++sc1)
{
sc2 = ct;
if(*sc1==*sc2)
{
for(sc3 = sc1;;++sc2,++sc3)
{
if(*sc2 == '\0')
return (char *)sc1;
if(*sc3 != *sc2)
break;
}
}
}
return NULL;
}
char *token;
if (s == NULL) s = *save_ptr;
/* Scan leading delimiters. */
//s += mystrspn(s, delim);
if (*s == '\0')
return NULL;
/* Find the end of the token. */
token = s;
s = mystrpbrk(token, delim);
if (s == NULL)
/* This token finishes the string. */
*save_ptr = strchr(token, '\0');
else {
/* Terminate the token and make *SAVE_PTR point past it. */
*s = '\0';
*save_ptr = s + strlen(delim);
}
return token;
}
以上改好后,我们就可以按字符拆分了。
char s[] =",Fred male 25,John male 62,Anna female 16";
char* delim = "male ";
char* tmp;
tmp = mystrtok(s, delim);
while(tmp != NULL)
{
printf("%s\n",tmp);
tmp = mystrtok(NULL, delim);
}
strtok和strtok_r,具体解析请参考:
http://blog.csdn.net/liuintermilan/article/details/6280816
http://blog.csdn.net/liuintermilan/article/details/6283705