日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

C語言模擬實現字符串操作函數

 新用戶53013299 2021-03-18

鏈接:https://blog.csdn.net/qq_34021920/article/details/76098237

前言

在編寫程序過程中,我們經常使用到一些字符串函數,例如求字符串長度,拷貝字符串……,這些函數都在C標準庫中存在,我們可以直接使用。但我們還需要掌握這些函數的實現方法,今天來看看一些常用的字符串操作函數的實現方法。

帶長度參數的函數

1. strlen

strlen是用來求字符串長度的函數,字符串長度就是字符串中包含的字符的個數,但是不包含字符串結尾的 '\0’ 實現strlen有三種方法:

(1)定義一個計數器

size_t mystrlen(const char* str)
{
    size_t count = 0;
    while (*str != '\0')
    {
        count++;
        str++;
    }
    return count;
}

(2)遞歸版本

size_t my_strlen(const char *str)
{
    if (*str == '\0')
        return 0;
    else
        return my_strlen(str + 1) + 1;
}

(3)利用指針 - 指針

size_t mystrlen(const char* str)
{
    const char* end = str;
    while (*end++);
    return end - str - 1;
}

2.strcpy

用于復制字符串的函數是strcpy,它的原型如下:

charstrcpy char* dest, const char* src );

使用這個函數時,要注意幾點 (1)目標字符數組的空間必須足夠大,足以容納需要復制的字符串 (2)目標字符數組要可以被修改 (3)被復制的字符串要可以找到’\ 0’

char *mystrcpy(char *dest, const char *src)
{
    char *res = dest;
    assert(dest);
    assert(src);
    while (*dest++ = *src++) ;//注意這里是一個等號
    return res;
}

3.strcat

strcat函數是可以把一個字符串添加(連接)到另一個字符串的后面。strcat函數要求dest參數原先已經包含了一個字符串(可以是空字符串)。它找到這個字符串的末尾,并把src字符串的一份拷貝添加到這個位置。

char *mystrcat(char *dest, const char *src)
{
    char *res = dest;
    assert(dest);
    assert(src);
    while (*dest != '\0')
        dest++;
    while (*dest++ = *src); //這里同樣也是一個等號

    return res;
}

4.strcmp

strcmp用于比較兩個字符串,及對兩個字符串對應的字符逐個進行比較,直到發(fā)現不匹配。那個最先不匹配的字符中較“小”的那個字符所在的字符串被認為“小于”另外一個字符串。如果其中一個字符串是另外一個字符串的前面一部分,那么它也被認為“小于”另外一個字符串,因為它的’\0’出現的更早。

int my_strcmp(const char* src1, const char* src2)
{
    while (*src1 == *src2)
    {
        if (*src1 == '\0')
            return 0
        src1 ++; 
        src2 ++; 
    } 
    return *src1 - *src2; 

5.strstr

為了在一個字符串中查找一個子串,可以使用strstr函數,該函數是在s1中查找整個s2第1次出現的起始位置,并返回一個指向該位置的指針。如果s2并沒有出現在s1的任何地方,函數將返回一個NULL指針。如果第二個函數是一個空字符串,函數就返回s1。

charmy_strstr(char* s1, const char* s2)
{
    char* p = s1;
    const char* q = s2;
    char* cur = NULL;

    assert(s1);
    assert(s2);
    if (*s2 == '\0')
        return s1;
    while (*p != '\0')
    {
        cur = p;
        while ((*p != '\0') && (*q != '\0') && (*p == *q))
        {
            p++;
            q++;
        }
        if (*q == '\0')
            return cur;
        p = cur + 1;
        q = s2;
    }
    return NULL;
}

6.strchr

strchr是用來查找一個特定的字符,在字符串str中查找字符ch第一次出現的位置,找到后函數返回一個指向該位置的指針。如果該字符并不存在于字符串中,函數就返回一個NULL指針

charmy_strchr(const char* str, char ch)
{
    const char* tmp = str;
    while (*tmp)
    {
        if (*tmp == ch)
            return tmp;
        tmp++;
    }
    return NULL;
}

7.strrchr

與strchr類似的查找函數還有一個是strrchr,它和strchr的不同之處在于,該函數返回的是一個指向字符串中該字符最后一次出現的位置

charmy_strrchr(const char* str, int ch)
{
    char* pos = 0;
    assert(str);
    while (*str)
    {
        if (*str == ch)
        {
            pos = str;
        }
        str++;
    }
    if (pos != 0)
    {
        return pos;
    }
    else
        return NULL;
}

長度受限制的字符串函數

標準庫中還包含一些函數,它們以一種不同的方式去處理字符串。這些函數接受一個顯示的長度參數,用于限定進行復制或比較的字符數。

1.strncpy

和strcpy一樣,strncpy()函數把源字符串的字符復制到目標空間,但是,它總是正好向dest中拷貝len個字符,如果strlen的(src)的值小于len,dest數組就用額外的’\0’填充到len字節(jié)長度。如果strlen的(src)的值大于或等于len,那么只有l(wèi)en個字符被復制到目標寄存器中。

charmy_strncpy(char* dest, const char* src, size_t len)
{
    char* res = dest;
    assert(dest);
    assert(src);

    while (len--)
    {
        *res++ = *src++;
    }
    if (*(res) != '\0')
        *res = '\0';
    return dest;
}

2.strncat

strncat函數,它從src中最多復制的len個字符到目標數組的后面。

charmy_strncat(char* dest, const char* src, size_t len)
{
    char* res = dest;
    assert(dest);
    assert(src);
    while (*dest != '\0')
        dest++;
    while (len--)
    {
        *dest = *src;
        dest++;
        src++;
    }
    return res;
}

3.strncmp

strncmp也用于比較兩個字符串,但它最多比較len個字節(jié)。如果兩個字符串在第len個字符之前存在不相等的字符,這個函數就像的strcmp一樣停止比較,返回結果。如果兩個字符串的前l(fā)en個字符相等,函數就返回零。

int my_strncmp(const char* s1, const char* s2, size_t len)
{
    assert(s1);
    assert(s2);
    while (len--)
    {
        if (*s1 == *s2)
        {
            s1++;
            s2++;
        }
        else
            return *s1 - *s2;
    }
    return 0;
}

標準庫里的字符串函數還有很多,今天就先介紹到這里。

溫馨提示

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多