C/C++知识点之C语言基础字符串函数源代码
小标 2019-02-19 来源 : 阅读 693 评论 0

摘要:本文主要向大家介绍了 C/C++知识点之C语言基础字符串函数源代码,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了 C/C++知识点之C语言基础字符串函数源代码,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之C语言基础字符串函数源代码

#include <stdio.h>
#include <assert.h>

/*
 * 作用:获取串str的长度
*/
int strlen(const char *pcStr)
{
    assert(pcStr != NULL);

    int iLen = 0;

    while ('\0' != *pcStr)
    {
        pcStr++;
        iLen++;
    }

    return iLen;
}

/*
 * 前提:strDes指向的内存至少能够容纳(strlen(strDes) + strlen(strSrc) + 1) bytes
 * 作用:将串strSrc连接到串strDes的末尾,函数本身不保证安全(使用不当会内存溢出)
*/
char *strcat(char *pcStrDest, const char *pcStrSrc)
{
    assert((pcStrDest != NULL) && (pcStrSrc != NULL));

    char *pcTemp = pcStrDest;

    /* pcStrDes指针指向串pcStrDes的末尾 */
    while ('\0' != *pcStrDest)
    {
        pcStrDest++;
    }

    /* 依次从源串pcStrSrc不断拷贝字符到目的串pcStrDes中 */
    while ('\0' != *pcStrSrc)
    {
        *pcStrDest = *pcStrSrc;

        pcStrSrc++;
        pcStrDest++;
    }

    *pcStrDest = *pcStrSrc;

    return pcTemp;
}

/*
 * 前提:strDes指向的内存至少能够容纳(strlen(strSrc) + 1) bytes
 * 作用:将串strSrc拷贝到strDes指向的内存空间,函数本身不保证安全(使用不当会内存溢出)
*/
char *strcpy(char *pcStrDest, const char *pcStrSrc)
{
    assert((pcStrDest != NULL) && (pcStrSrc != NULL));

    char *pcTemp = pcStrDest;

    while ('\0' != *pcStrSrc)
    {
        *pcStrDest = *pcStrSrc;

        pcStrSrc++;
        pcStrDest++;
    }

    *pcStrDest = *pcStrSrc;

    return pcTemp;
}

/*
 * 作用:按字典序比较串s和串t的大小
*/
int strcmp(const char *pcStrA, const char *pcStrB)
{
    assert((pcStrA != NULL) && (pcStrB != NULL));

    while (('\0' != *pcStrA) && ('\0' != *pcStrB) && (*pcStrA == *pcStrB))
    {
        pcStrA++;
        pcStrB++;
    }

    return (int)(*pcStrA - *pcStrB);
}

/*
 * 前提:strDes指向的内存至少能够容纳(strlen(strDes) + count + 1) bytes
 * 作用:将串strSrc的前count个字符连接到串strDes的末尾,函数本身不保证安全(使用不当会内存溢出)
*/
char *strncat(char *pcStrDest, const char *pcStrSrc, int iCount)
{
    assert((pcStrDest != NULL) && (pcStrSrc != NULL));

    char *pcTemp = pcStrDest;

    while ('\0' != *pcStrDest)
    {
        pcStrDest++;
    }

    while ((iCount > 0) && ('\0' != *pcStrSrc))
    {
        *pcStrDest = *pcStrSrc;

        pcStrSrc++;
        pcStrDest++;
        iCount--;
    }

    *pcStrDest = '\0';

    return pcTemp;
}

/*
 * 前提:strDes指向的内存至少能够容纳(count + 1) bytes
 * 作用:将串strSrc的前count个字符拷贝到strDes指向的内存空间,函数本身不保证安全(使用不当会内存溢出)
*/
char *strncpy(char *pcStrDest, const char *pcStrSrc, int iCount)
{
    assert((pcStrDest != NULL) && (pcStrSrc != NULL));

    char *pcTemp = pcStrDest;

    while ((iCount > 0) && ('\0' != pcStrSrc))
    {
        *pcStrDest = *pcStrSrc;

        pcStrSrc++;
        pcStrDest++;
        iCount--;
    }

    return pcTemp;
}

/*
 * 作用:按字典序比较串s和串t的前count个字符的大小
*/
int strncmp(const char *pcStrA, const char *pcStrB, int iCount)
{
    assert((pcStrA != NULL) && (pcStrB != NULL));

    while (('\0' != *pcStrA) && ('\0' != *pcStrB) && (*pcStrA == *pcStrB) && 
           (iCount > 0))
    {
        iCount--;
        if (0 == iCount)
        {
            break;
        }

        pcStrA++;
        pcStrB++;
    }

    return (int)(*pcStrA - *pcStrB);
}

/*
 * 前提:dest指向的内存能够容纳count bytes
 * 作用:将src所指向内存的count bytes拷贝到的dest指向的内存
*/
void *memcpy(void *pvDest, const void *pvSrc, int iCount)
{
    assert((pvDest != NULL) && (pvSrc != NULL));

    void *pvTemp = pvDest;
    char *pcDest = (char *)pvDest;
    const char *pcSrc = (const char *)pvSrc;

    while (iCount > 0)
    {
        *pcDest = *pcSrc;

        pcDest++;
        pcSrc++;
        iCount--;
    }

    return pvTemp;
}

/*
 * 作用:将str的前count个字节置为字符c
*/
void *memset(void *pvSrc, int iCh, int iCount)
{
    assert(pvSrc != NULL);

    char *pcSrc = (char *)pvSrc;

    while (iCount > 0)
    {
        *pcSrc = (char)iCh;

        pcSrc++;
        iCount--;
    }

    return pvSrc;
}

/*
 *  作用:将src所指向内存的count bytes拷贝到的dest指向的内存(解决了memcpy未解决的内存重叠问题)
*/
void *memmove(void *pvDest, const void *pvSrc, int iCount)
{
    assert((pvDest != NULL) && (pvSrc != NULL));

    void *pvTemp = pvDest;
    char *pcDest = (char *)pvDest;
    const char *pcSrc = (const char *)pvSrc;

    // 逻辑:
    // 1)在src小于dest前提下,然后判断src+count指向的内存是否与dest指向的内存重叠
    // 2) 如果重叠则从src+count开始复制,复制到dest+count,从后往前拷贝count字节
    if ((pvSrc < pvDest) && (pvSrc + iCount > pvDest))
    {
        pcDest = pcDest + iCount - 1;
        pcSrc = pcSrc + iCount - 1;

        while (iCount > 0)
        {
            *pcDest = *pcSrc;

            pcDest--;
            pcSrc--;
            iCount--;
        }
    }
    else
    {
        while (iCount > 0)
        {
            *pcDest = *pcSrc;

            *pcDest++;
            *pcSrc++;
            iCount--;
        }
    }

    return pvTemp;
}

int main()
{
    int iLen = 0;
    int iRet = 0;
    char acBuffer[4] = {0};
    char *pcTestStr1 = "Today is sunday.";
    char acTestStr2[] = "Today";
    char acTestStr3[] = "Today is sunday.";
    char acTestStr4[sizeof("Today is ") + sizeof("sunday.") - 1] = "Today is ";

    iLen = strlen(pcTestStr1);

    printf("iLen = %d\n", iLen);

    (void)strncpy(acBuffer, pcTestStr1, sizeof(acBuffer) - 1);

    printf("acBuffer:%s\n", acBuffer);

    iRet = strncmp(pcTestStr1, acTestStr2, strlen(acTestStr2));

    printf("strncmp iRet = %d\n", iRet);

    iRet = strcmp(pcTestStr1, acTestStr2);

    printf("strcmp iRet = %d\n", iRet);

    (void)memmove(&acTestStr3[1], &acTestStr3[0], strlen("Today"));

    printf("memmove acTestStr3:%s\n", acTestStr3);

    printf("before strncat acTestStr4:%s\n", acTestStr4);

    (void)strncat(acTestStr4, "sunday.111", 
                  sizeof(acTestStr4) - strlen(acTestStr4) - 1);

    printf("after strncat acTestStr4:%s\n", acTestStr4);

    return 0;
}

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程