歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C/C++ 對常見字符串庫函數的實現

在C中的string.h頭文件中存在很多對字符串進行操作的函數,利用這些函數可以方便的對字符串進行操作。下面將對常見的字符串函數進行解釋和實現。

strcpy
函數原型:char* _strcpy(char* dest,char* src)
函數功能:將str所指由nullptr的字符串復制到dst所指的數組中,並返回dest的指針。
函數說明:保證src和dest所指內存區域不能重疊且dest必須有足夠的空間來容納src的字符串。
函數實現

char* _strcpy(char* dest, const char* src)
{
    assert(dest != nullptr&&src != nullptr);
    //判斷dest指針和src指針是否為空,若為空拋出異常
    char* tmp = dest;
    while (*tmp++ = *src++)
        ;
    return dest;
}

strncpy

函數原型:char* _strncpy(char* dest,const char* src,size_t n)
函數功能:把src所指由nullptr結尾的字符串前n個字節復制到dest所指的數組中。
函數說明:如果src的前n個字節不含nullptr,則結果不會以nullptr結束;如果src的的長度小於n個字節,則以nullptr填充dest直到復制完n個字節;保證src和dest所指內存區域不能重疊且dest必須有足夠的空間來容納src的字符串。
函數實現

char* _strncpy(char* dest, const char* src, int n)
{
    assert(dest != nullptr&&src != nullptr);
    //判斷dest指針和src指針是否為空,若為空拋出異常
    int i = 0;
    char* tmp = dest;
    while (i++ < n && (*tmp++ = *src++))
        ;
    while (i++ < n)
        *tmp++ = '\0';
    return dest;
}

strcat
函數原型:char* _strcat(char dest, const char src)
函數功能:把src所指字符串添加到dest結尾處(覆蓋dest結尾處的'\0')並添加'\0'。
函數說明:保證src和dest所指內存區域不能重疊且dest必須有足夠的空間來容納src的字符串。
函數實現

char* _strcat(char* dest, const char* src)
{
    assert(dest != nullptr&&src != nullptr);
    //判斷dest指針和src指針是否為空,若為空拋出異常
    char* tmp = dest;
    while (*tmp)//若為while(*dest++)則會跳過dest中的'\0'導致無法連接
        tmp++;
    while (*tmp++ = *src++)
        ;
    return dest;
}

注意:使用時若實參dest的創建為char* dest=“abcd”,雖然可以編譯通過,但運行時會引發中斷,因為“abcd”為字符串常量,不可修改,可以使用char dest[n]="abcd"進行創建。

strncat
函數原型:char* _strncat(char* dest, const char* src,size_t n)
函數功能:把src所指字符串的前n個字符添加到dest結尾處(覆蓋dest結尾處的'\0')並添加'\0'。
函數說明:保證src和dest所指內存區域不能重疊且dest必須有足夠的空間來容納src的字符串。
函數實現

char* _strncat(char* dest, const char* src, size_t n)
{
    assert(dest != nullptr&&src != nullptr);
    //判斷dest指針和src指針是否為空,若為空拋出異常
    char* tmp = dest;
    while (*tmp)//若為while(*dest++)則會跳過dest中的'\0'導致無法連接
        tmp++;

    while (n--)
    {
        if (!(*tmp++ = *src++))//保證當src的長度小於n時,此時tmp已有'\0'
            return dest;
    }

    *tmp = '\0';//對於src長度大於n時,加上字符串結尾
    return dest;
}

strlen
函數原型:size_t _strlen(const char* str)
函數功能:計算字符串str的長度。
函數說明:返回s的長度,不包括結束符NULL。
函數實現

//常規寫法
size_t _strlen(const char* str)
{
    assert(str);
    const char* eofStr = str;
    while (*eofStr++)
        ;
    return (eofStr - str - 1);
}
//遞歸寫法,不借助變量(面試題要求)
size_t _strlen_R(const char* str)
{
    /*if ('\0' == str)
        return 0;

    return _strlen_R(str + 1) + 1;*/

    return *str ? _strlen_R(str + 1) + 1 : 0;//更為簡潔
}

strcmp
函數原型:int _strcmp(const char* dest, const char* src)
函數功能:比較字符串dest和src。
函數說明
當dest< src時,返回值 < 0
當dest= src時,返回值 = 0
當dest> src時,返回值 > 0
函數實現

int _strcmp(const char* dest, const char* src)
{
    assert(dest != nullptr&&src != nullptr);
    //判斷dest指針和src指針是否為空,若為空拋出異常
    while (*dest&&*src && (*dest == *src))
    {
        dest++;
        src++;
    }
    return (*dest - *src);
}

strncmp
函數原型:int _strncmp(const char* dest, const char* src, size_t n)
函數功能:比較字符串dest和src的前n個字符。
函數說明: 如果前n字節完全相等,返回值就為0;在前n字節比較過程中,如果出現dest[n]與src[n]不等,則返回(dest[n]-src[n])。
函數實現

int _strncmp(const char* dest, const char* src, size_t n)
{
    assert(dest != nullptr&&src != nullptr);
    //判斷dest指針和src指針是否為空,若為空拋出異常
    if (!n)//若n為0,則返回0;
        return 0;
    while (n--&&*dest&&*src && (*dest == *src))
    {
        dest++;
        src++;
    }

    return (*dest - *src);
}

strstr
函數原型
函數功能:找出src字符串在dest字符串中第一次出現的位置(不包括src的'\0')
函數說明:返回該位置的指針,如找不到,返回空指針。
函數實現

char* _strstr(const char* dest, const char* src)
{
    assert(dest != nullptr);
    //判斷dest指針是否為空,若為空拋出異常
    if (!src)
        return (char*)dest;

    while (*dest)
    {
        const char* destTmp = dest;
        const char* srcTmp = src;
        while (*srcTmp == *destTmp && (*srcTmp))//限時*srcTmp與*destTmp比較後相等至'\0'時繼續訪問出現越界
        {
            srcTmp++;
            destTmp++;
        }
        if (!(*srcTmp))
            return (char*)destTmp;

        dest++;
    }
    return nullptr;
}

如有錯誤請指出,謝謝。

本文永久更新鏈接���址:http://www.linuxidc.com/Linux/2016-05/131638.htm

Copyright © Linux教程網 All Rights Reserved