使用C语言,编写函数,要求不适用C/C++库函数,实现strtok函数功能。
思路:Linux函数原型:char *strtok(char *str, const char *delim); 返回分隔符pSubStr之前的字符串。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
//char *strtok(char *str, const char *delim);
char* mystrtok(char *pStr1, const char *pSubStr)
{
//返回分隔符pSubStr之前的字符串
static char* p_sStr = pStr1; //static变量在第一次定义时候初始化,后续再调用函数都是上一次的值
if ((pSubStr == NULL) || ((p_sStr == NULL) && (pStr1 == NULL))) {
assert(0);
}
if (*pSubStr == '\0') {
if (pStr1 != NULL) {
return pStr1; //如果第一次调用,pSubStr[0] == '\0',直接返回字符串pStr1
}
else {
return NULL; //如果后续调用,pSubStr[0] == '\0',直接返回NULL
}
}
char* pStr1Pos = NULL;
if (pStr1 != NULL) {
pStr1Pos = pStr1; //第一次
}
else {
pStr1Pos = p_sStr; //非第一次
}
while (*pStr1Pos != '\0') {
const char* pSubTmp = pSubStr;
char* pStr1Tmp = pStr1Pos;
while (*pSubTmp == *pStr1Tmp) {
++pStr1Tmp;
++pSubTmp;
}
if (*pSubTmp == '\0') { //比较到最后,说明查到了
*pStr1Pos = '\0';
char* pResult = p_sStr;
p_sStr = pStr1Tmp; //重置p_sStr
return pResult;
}
++pStr1Pos;
}
return NULL;
}
int main()
{
char szBuf[32] = { 0 };
strcpy(szBuf, "abc11def11ghi11");
//strcpy(szBuf, "11def11ghi11");
char* pResult = mystrtok(szBuf, "11");
while (pResult != NULL) {
printf("pResult=[%s]\n", pResult);
pResult = mystrtok(NULL, "11");
}
return 0;
}
程序运行结果: