#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*************************************************************************
* 01 - strlen 计算字符串长度
* size_t strlen_Func(const char *str);
* 02 - strRev 字符除按逆序
* char *strRev(char *strSrc);
* 03 - strcat 字符串拼接
* char *strcat_Func(char *strDst, const char *strSrc)
* 04 - strcpy 字符串拷贝
* char *strcpy_Func(char *strDst, const char *strSrc)
* 05 - strcmp 字符串比较
* int strcmp_Func(const char *strDst, const char *strSrc)
* 06 - strstr: 返回字符串中首次出现子串的地址
* char *strstr_Func(const char *strDst, const char *strSub)
* 07 - memcpy:内存拷贝
* void *memcpy_Func(void *strDst, const void *strSrc, size_t nbytes)
* 08 - caculate substring: 计算子串出现的次数
* int getSubTimes(const char *strSrc, const char *strSub)
* 09 - delete substring: 删除子串
* char *delSubString(char *strSrc, const char *strSub)
***************************************************************************/
/* 01 - strlen */
size_t strlen_Func(const char *str)
{
int cnt = 0;
char *pStr = (char *)str;
while(pStr != NULL && *pStr++ != '\0')
{
++cnt;
}
return cnt;
}
void test01()
{
const char msg[] = "Keep Calm and carry on, Jesse.";
int iLen = strlen_Func(msg);
printf("len = %d\n", iLen);
}
/* 02 - strRev */
char *strRev(char *strSrc)
{
char *pFront = strSrc;
char *pRear = strSrc;
#if 0
while(*pRear++ != '\0');
pRear -= 2;
#else
while(*pRear != '\0')
{
pRear++;
}
--pRear;
#endif
while(pFront < pRear)
{
char ch = *pFront;
*pFront++ = *pRear;
*pRear-- = ch;
}
return strSrc;
}
void test02()
{
//char msg[] = "Keep Calm and carry on, Jesse.";
char msg[] = "keep";
char *p = NULL;
p = strRev(msg);
printf("%s\n", p);
}
/* 03 - strcat */
char *strcat_Func(char *strDst, const char *strSrc)
{
char *pDst = strDst;
char *pSrc = (char*)strSrc;
while(*pDst++ != '\0');
pDst--;
while((*pDst++ = *pSrc++) != '\0');
return strDst;
}
void test03()
{
char msg[] = "Hello";
const char *msg1 = "AAA";
char *p = strcat_Func(msg, msg1);
printf("%s\n", p);
}
/* 04 - strcpy */
char *strcpy_Func(char *strDst, const char *strSrc)
{
char *pDst = strDst;
char *pSrc = (char *)strSrc;
while((*pDst++ = *pSrc++) != '\0');
return strDst;
}
void test04()
{
char msg[] = "Hello";
const char *msg1 = "AAA";
char *p = strcpy_Func(msg, msg1);
printf("%s\n", p);
}
/* 05 - strcmp */
int strcmp_Func(const char *strDst, const char *strSrc)
{
int iRet = 0;
char *pDst = (char *)strDst;
char *pSrc = (char *)strSrc;
while(*pDst && *pSrc && *pDst == *pSrc)
{
++pDst;
++pSrc;
}
iRet = *pDst - *pSrc;
if(iRet >=1)
{
iRet = 1;
}
if(iRet < 0)
{
iRet = -1;
}
return iRet;
}
void test05()
{
char msg[] = "Hello";
const char *msg1 = "Hello";
int iRet = strcmp_Func(msg, msg1);
printf("%d\n", iRet);
}
/* 06 - strstr: 返回字符串中首次出现子串的地址 */
char *strstr_Func(const char *strDst, const char *strSub)
{
char *pDst = (char *)strDst;
while(*pDst != '\0')
{
char *pSub = (char *)strSub;
int cnt = 0;
while(*pDst != '\0' && *pSub != '\0' && *pDst == *pSub)
{
++pDst;
++pSub;
cnt++;
}
if(*pSub == '\0')
{
return pDst - cnt;
}
++pDst;
}
return NULL;
}
void test06()
{
char msg[] = "Keep calm and carry on, Jesse.";
const char *msg1 = "arr";
char *pRet = strstr_Func(msg, msg1);
printf("%s\n", pRet);
}
/* 07 - memcpy */
void *memcpy_Func(void *strDst, const void *strSrc, size_t nbytes)
{
char *pDst = (char *)strDst;
char *pSrc = (char *)strSrc;
while(nbytes--)
{
*pDst++ = *pSrc++;
}
*pDst = '\0';
return strDst;
}
void test07()
{
const char strMsg[] = "Keep Calm and carry on, Jesse.";
char *msg = NULL;
msg = (char *)malloc(64);
size_t iLen = *(&strMsg + 1) - strMsg - 1;
#if 1
memcpy_Func(msg, strMsg, iLen-1);
#else
memcpy(msg, strMsg, iLen-1);
#endif
printf("msg = %s\n", msg);
if(msg != NULL)
{
free (msg);
msg = NULL;
}
}
/* 08 - caculate substring */
int getSubTimes(const char *strSrc, const char *strSub)
{
int cnt = 0;
char *pSrc = (char *)strSrc;
while(*pSrc != '\0')
{
char *pSub = (char *)strSub;
while(*pSub != '\0' && *pSrc != '\0' && *pSrc == *pSub)
{
++pSrc;
++pSub;
}
if(*pSub == '\0')
{
cnt++;
}
if(*pSub == *strSub)
{
++pSrc;
}
}
return cnt;
}
void test08()
{
char msg[] = "Keep Calm And Carry On, Jesseeee.";
char sub[] = "ee";
int iRet = getSubTimes(msg, sub);
printf("iRet = %d\n", iRet);
}
/* 09 - delete substring */
char *delSubString(char *strSrc, const char *strSub)
{
int iLen = strlen(strSub);
while(1)
{
char *pHead = strSrc;
char *pSrc = strSrc;
char *pRight = strstr(pSrc, strSub);
if(NULL == pRight)
{
return pSrc;
}
while(pSrc++ != pRight);
--pSrc;
*pSrc = '\0';
strcat(pHead, pRight+iLen);
strSrc = pHead;
}
}
void test09()
{
char msg1[] = "OnKeep Calm And Carry On.OnOnOnOn";
char sub[] = "On";
printf("%s\n",msg1);
char *pRet = delSubString(msg1, sub);
printf("%s\n", pRet);
}
int main(int argc, char *argv[])
{
#if 0
test01();
test02();
test03();
test04();
test05();
test06();
test07();
test08();
#else
test09();
#endif
return 0;
}