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

2021-12-29 嵌入式大雜燴
前言

在編寫程序過程中,我們經常使用到一些字符串函數,例如求字符串長度,拷貝字符串……,這些函數都在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,它的原型如下:

char* strcpy ( 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用於比較兩個字符串,及對兩個字符串對應的字符逐個進行比較,直到發現不匹配。那個最先不匹配的字符中較「小」的那個字符所在的字符串被認為「小於」另外一個字符串。如果其中一個字符串是另外一個字符串的前面一部分,那麼它也被認為「小於」另外一個字符串,因為它的』\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。

char* my_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指針

char* my_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的不同之處在於,該函數返回的是一個指向字符串中該字符最後一次出現的位置

char* my_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字節長度。如果strlen的(src)的值大於或等於len,那麼只有len個字符被複製到目標寄存器中。

char* my_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個字符到目標數組的後面。

char* my_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個字節。如果兩個字符串在第len個字符之前存在不相等的字符,這個函數就像的strcmp一樣停止比較,返回結果。如果兩個字符串的前len個字符相等,函數就返回零。

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

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

溫馨提示

由於微信公眾號近期改變了推送規則,如果您想經常看到我們的文章,可以在每次閱讀後,在頁面下方點一個「贊」或「在看」,這樣每次推送的文章才會第一時間出現在您的訂閱列表裡。

版權聲明:本文來源網絡,免費傳達知識,版權歸原作者所有。如涉及作品版權問題,請聯繫我進行刪除。

猜你喜歡:

實用 | 分享幾個非常實用的開源項目

C語言實現MD5加密(附代碼)

每天都能見到的 extern "C" 並沒有那麼簡單!

不按套路出牌,這麼來寫IIC驅動?

乾貨 | C語言實現面向對象編程(附代碼)

2020年精選原創筆記匯總

在公眾號聊天界面回復1024,可獲取嵌入式資源;回復 m ,可查看文章匯總。

文章都看完了不點個嗎

相關焦點

  • C語言對字符串的處理
    數組退化成指針為「常量指針」,不可更改,而直接指向字符串的指針可修改,如:char a[10] = "China";const char* p = "China";a++;   // 錯誤的p++;   // 正確的5.C語言字符串指針(指向字符串的指針)C語言中沒有特定的字符串類型,我們通常是將字符串放在一個字符數組中
  • C語言字符數組和字符串
    字符串數據類型是建模在形式字符串的想法上的數據類型。字符串是幾乎在所有程式語言中可以實現的非常重要和有用的數據類型。在某些語言中它們可作為基本類型獲得,在另一些語言中做為複合類型獲得。多數高級語言的語法允許通常用某種方式引用起來的字符串來表示字符串數據類型的實例;這種元字符串叫做「文本」或「字符串文本」。
  • C 語言實現動態字符串
    其他語言中的字符串類型通常在存儲字符串本身時也保存了字符串長度,如Pascal,這樣做的好處是字符串也可以以空字符'\0'結尾,但也會產生緩衝區溢出錯誤,本文實現了一個簡單的動態字符串庫,首先考慮一下,採用什麼樣的數據結構可以避免緩衝區溢出問題呢,為簡化起見,我們定義「字符串」為內存中無類型的字節流,因此可以避開本地化和Unicode等概念
  • C語言字符串處理函數之字符串轉換、查詢函數
    介紹完字符串整體操作函數,就該到字符串查詢函數和字符串轉換函數了,至於一些字符串轉換函數,如atoi(),atof(),strtod(),strtol(),tolower(),toupper()等,以後有時間再整理整理。
  • c語言字符串 數字轉換函數大全
    float c;     c=atof(a)+atof(b);     printf(「c=%.2f\n」,c);     }執行 c=-98.23atoi(將字符串轉換成整型數)相關函數 atof,atol,atrtod,strtol,strtoul
  • C語言:優雅的字符串函數庫
    例如:用新語言寫代碼注釋 / commit message / README / issue;對了,我作為英文的愛好者,一直想重啟我的英文學習之路,後續想在公眾號裡記錄一些英文相關的知識,請你們不要笑話我~~~二、字符串函數庫:Simple
  • c語言如何查找字符串指定字符
    c語言查找字符串指定字符的方法:1、【strchr()】用來查找某字符在字符串中首次出現的位置;2、【strrchr()】函數用於查找某字符在字符串中最後一次出現的位置
  • 【C語言更新】C語言中字符串的操作
    void  *memcpy(void *dest, const void *src, size_t n)void  *memmove(void *dest, const void *src, size_t n)另一個用於從 src 複製  n 個字符到 dest 的函數。
  • Golang語言之字符串操作
    %o八進位整數%b二進位整數%f,%g,%e浮點數%t布爾值%c字符%s字符串%q帶雙引號的字符串%v內置格式內容%T類型%p內存地址%%字符%\n換行\t縮進文章內容主要以代碼注釋講解相關知識點如有紕漏,後續會在「Go 語言研究院」https://www.golanghub.cn 修正。如果文章對您有所幫助,還請關注公眾號給予支持。
  • C語言字符數組與字符串的使用詳解
    2、字符數組與字符串在c語言中,將字符串作為字符數組來處理。(c++中不是)在實際應用中人們關心的是有效字符串的長度而不是字符數組的長度,例如,定義一個字符數組長度為100,而實際有效字符只有40個,為了測定字符串的實際長度,C語言規定了一個「字符串結束標誌」,以字符'\0'代表。
  • 在C語言中如何高效地複製和連接字符串?
    作者 | Martin Sebor譯者 | 蘇本如,責編 | 劉靜以下為譯文:在所有標準C語言<string.h>頭文件中聲明的字符串處理函數中,最常用的是那些用來複製和連接字符串的函數。兩個或多個字符串的連接操作的最佳複雜度和字符數量成線性關係。但是,如上所述,讓函數返回指向目標字符串的指針會導致操作的效率明顯低於最佳效率。該函數遍歷源字符串序列和目標字符串序列,並獲取指向這兩個序列末尾的指針。該指針指向函數(strncpy除外)附加到目標序列上的字符串結束符NUL('\0')處或它的後一位。
  • c語言中的字符串操作函數
    一,常量指針與指針常量先來補充一個上篇文章 手把手教你深入理解c/c++中的指針 我在講述指針中的一個問題,有人說常量指針與指針常量這兩個概念總是混淆怎麼辦,例如:int a = 100;const int * p = &a;  int const * p = &a;
  • C語言中的字符串操作函數
    我們知道,c/c++之所以使用起來靈活,很大原因歸因於它能夠它對能夠對內存的直接操作,所以本文我主要講述一下c中的字符串操作函數。我們再回到本節的字符串問題上,在講述字符串拷貝函數前,我們再來回憶一下c語言中的字符串。
  • C語言實現將字符串轉換為數字的方法
    這篇文章主要介紹了C語言實現將字符串轉換為數字的方法,涉及系統函數atoi()函數的使用技巧,需要的朋友可以參考下本文實例講述了C語言實現將字符串轉換為數字的方法。
  • 【開源共享】拿來即用的C語言字符串函數庫
    一、字符串函數庫:Simple Dynamic Strings1. 簡介Simple Dynamic Strings (簡稱 SDS) 是一個 C 語言字符串庫,它增強了 C 語言字符串處理的能力。設計 SDS 原本是為了滿足設計者自身日常的 C 編程,後來又被轉移到 Redis 中,在 Redis 中被廣泛使用並對其進行了修改以適合於高性能操作。現在,它又被從 Redis 中提取出來的,並 fork 為一個獨立項目。
  • c語言指針與字符數組
    我們所說的字符串就是字符數組的一種,就如我們常見的"hello world!",字符串的使用在C語言中也是非常重要的,常常會遇到一些操作,如字符串的修改、拷貝、字符串長度等,在物聯網的應用中也尤為突出,物聯網應用中所用的模組,大多是需要使用AT指令的,這就需要對字符串的操作。
  • C語言字符串函數strcat | strcpy | strlen | strcmp的用法及原型
    return strDest;               //為了實現鏈式操作,將目的地址返回}dev c++調試代碼如下#include<stdio.h>#include<string.h>char
  • 在C語言常見的處理字符串函數分別有哪些?
    常見的處理字符串函數有如下:1、strcpy函數:先定義兩個字符數組,分別代表s1和s2,則:strcpy(s1,s2);
  • 【自學C語言】書筆記I 29 指針和字符串
    一、指針和字符串    在C語言中,指針和字符串的關係十分密切,二者之間的相互關聯可以實現具體的用戶需求。
  • C語言中字符串和數字的相互轉換實現代碼
    以下是對C語言中字符串和數字的相互轉換實現代碼進行了分析介紹,需要的朋友可以參考下1.數字轉換為字符串sprintf 跟printf 在用法上幾乎一樣,只是列印的目的地不同而已,前者列印到字符串中,後者則直接在命令行上輸出。