C语言面试题 - string相关API源码

#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;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值