最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章教你如何用C語言實現(xiàn)strcpy和strlen

 更新時間:2022年01月07日 15:01:15   作者:黎丶辰  
這篇文章主要為大家介紹了C語言實現(xiàn)strcpy和strlen的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

 自己實現(xiàn)strcpy、strlen

strcpy的實現(xiàn)

思路:

通過指針訪問地址然后將要copy的文本逐一復(fù)制到目的地。

void my_strcpy(char* dest, char* src){
    while (*src !='\0'){
        *dest = *src;
        src++;
        dest++;
    }
    *dest = *src;
}

//自己實現(xiàn)strcpy
int main(){
    char arr1[]="$$$$$$$$$$";
    char arr2[]="hello";
    my_strcpy(arr1,arr2);//將arr的內(nèi)容復(fù)制到arr1中
    printf("%s\n",arr2);
    return 0;
}

優(yōu)化1:

在my_strcpy()函數(shù)中*dest和*src直接在表達式中自加,先試用后加所以使用后置++

void my_strcpy(char* dest, char* src){
    while (*src !='\0'){
        *dest++ = *src++;
    }
    *dest = *src;
}

優(yōu)化2:

在while循環(huán)中,因為最后的終止條件是賦值到了絕對0的時候停止循環(huán)。那么最后一次賦值就是賦值0。那我們直接可以將賦值作為我們的終止條件。

void my_strcpy(char* dest, char* src){
    while (*dest++ = *src++);
    *dest = *src;
}

優(yōu)化3:

如果傳入的是空指針我們應(yīng)該告訴這個輸入有問題。

引入assert();斷言–>如果輸入錯誤顯示錯誤。 個人理解就像java,python中的異常處理。

#include <assert.h>
void my_strcpy(char* dest, char* src){
    assert(dest != NULL);
    assert(src != NULL);
    while (*dest++ = *src++);
    *dest = *src;
}
//自己實現(xiàn)strcpy
int main(){
    char arr1[]="$$$$$$$$$$";
    char arr2[]="hello";
    my_strcpy(arr1,NULL);//將arr的內(nèi)容復(fù)制到arr1中
    printf("%s\n",arr2);
    return 0;
}

優(yōu)化4:

在程序員將dest 和 src寫反的情況。我們應(yīng)該怎么處理呢?

加const 使得我們的原來的數(shù)據(jù)不能被拷貝數(shù)據(jù)不能進行修改。從強制檢測。另一方面解釋:源頭的數(shù)據(jù)的安全性得到保證。

#include <assert.h>
void my_strcpy(char* dest,const char* src){
    assert(dest != NULL);
    assert(src != NULL);
    while (*dest++ = *src++);  //這里寫反的話將不能進行賦值   因為c
    *dest = *src;
}

對于const的講解

const int* p = &num;
int* const p = &num;
const int* const p = &num;

在第一行中:即const 放在指針變量* 的左邊的時候修飾的是*p 也就是說也就是說不能通過*p來改變*p(num )的值。

在第二行中:即const放在指針變量* 的右邊的時候修飾的是指針本身p,p不能被改變。

在第三行中:兩邊都進行const修飾,p與*p都不能改變了。

我的理解:const只能修飾關(guān)鍵字本身右邊的第一個東西(像int*就直接理解為指針)。const修飾的東西被限制。

優(yōu)化5:

在官方提供的庫函數(shù)中strcpy是有返回值的。返回什么呢?我們應(yīng)該返回copy執(zhí)行完成之后的字符串中首字母的地址。但是我們發(fā)現(xiàn)之前已經(jīng)在執(zhí)行的過程中就將dest值修改了。又怎么辦呢?在刷算法題的時候有個經(jīng)驗就是,在對地址進行操作之前先提前備份一份。然后將備份的這個地址位置返回即可。

#include <assert.h>
char* my_strcpy(char* dest,const char* src){
    char* res = dest;
    assert(dest != NULL);
    assert(src != NULL);
    while (*dest++ = *src++);
    *dest = *src;//將'\0'進行賦值。
    return res;
}
#include <assert.h>
char* my_strcpy(char* dest,const char* src){
    char* res = dest;
    assert(dest != NULL);
    assert(src != NULL);
    while (*dest++ = *src++);
    *dest = *src;//將'\0'進行賦值。
    return res;
}

總結(jié)

    1. 分析參數(shù)的設(shè)計(命名,類型),返回值的情況。
    2. 關(guān)于野指針問題,空指針的危害。
  	3. assert的使用方式和作用
  	4. 參數(shù)部分使用const,以及const的作用。
  	5. 注釋的重要性。

strlen的實現(xiàn)

#include <assert.h>
int my_strlen(const char* str){//不希望我的字符串被修改。
    int count = 0;
    assert(str != NULL);//用來保證指針的有效性
    while(*str !='\0'){
        count++;
        str++;
    }
    return count;
}

int main(){
    char arr[] = "abcdef";
    int len = my_strlen(arr);
    printf("%d\n",len);
    return 0;
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語言中的盜賊(小偷)問題詳解

    C語言中的盜賊(小偷)問題詳解

    大家好,本篇文章主要講的是C語言中的盜賊(小偷)問題詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C語言線性表順序存儲結(jié)構(gòu)實例詳解

    C語言線性表順序存儲結(jié)構(gòu)實例詳解

    這篇文章主要介紹了C語言線性表順序存儲結(jié)構(gòu)實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • QT中QStringListModel類的應(yīng)用介紹

    QT中QStringListModel類的應(yīng)用介紹

    QStringListModel是最簡單的模型類,具備向視圖提供字符串?dāng)?shù)據(jù)的能力,本文主要介紹了QT中QStringListModel類的應(yīng)用介紹,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • C++中的類成員函數(shù)當(dāng)線程函數(shù)

    C++中的類成員函數(shù)當(dāng)線程函數(shù)

    這篇文章主要介紹了C++中的類成員函數(shù)當(dāng)線程函數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++中隱式類型轉(zhuǎn)換學(xué)習(xí)筆記

    C++中隱式類型轉(zhuǎn)換學(xué)習(xí)筆記

    在本篇文章里小編給大家整理的是一篇關(guān)于C++中隱式類型轉(zhuǎn)換學(xué)習(xí)筆記內(nèi)容,有興趣的跟著小編來學(xué)習(xí)下吧。
    2020-02-02
  • C++異常處理的方式總結(jié)

    C++異常處理的方式總結(jié)

    C++有一套獨立的異常處理機制,相信大家一定聽說過try,catch這兩
    個詞,今天就來做詳細的介紹,文中通過代碼示例給大家介紹的非常詳細,具有一定參考價值,需要的朋友可以參考下
    2023-12-12
  • 深入學(xué)習(xí)C語言中常見的八大排序

    深入學(xué)習(xí)C語言中常見的八大排序

    排序編程中非?;A(chǔ)的的理論方法,雖然排序的方法多,但是理解起來并不難,它是最基本的,初學(xué)者一定要掌握的東西。本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值
    2021-11-11
  • C語言中等待socket連接和對socket定位的方法

    C語言中等待socket連接和對socket定位的方法

    這篇文章主要介紹了C語言中等待socket連接和對socket定位的方法,分別為listen()函數(shù)和bind()函數(shù)的用法,需要的朋友可以參考下
    2015-09-09
  • C++實現(xiàn)二叉樹非遞歸遍歷方法實例總結(jié)

    C++實現(xiàn)二叉樹非遞歸遍歷方法實例總結(jié)

    這篇文章主要介紹了C++實現(xiàn)二叉樹非遞歸遍歷方法實例總結(jié),是算法設(shè)計中比較經(jīng)典的一個遍歷算法,需要的朋友可以參考下
    2014-08-08
  • C/C++的內(nèi)存管理你了解嘛

    C/C++的內(nèi)存管理你了解嘛

    這篇文章主要為大家介紹了C/C++的內(nèi)存管理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評論

随州市| 海南省| 延安市| 喀喇沁旗| 临江市| 乐亭县| 松江区| 滨州市| 孝昌县| 徐汇区| 上虞市| 高邑县| 呼伦贝尔市| 萍乡市| 普宁市| 钟山县| 陆河县| 博兴县| 白玉县| 抚顺县| 寻乌县| 宜兰市| 安阳县| 珲春市| 阳西县| 铜陵市| 勐海县| 健康| 澄江县| 鸡泽县| 绥滨县| 平遥县| 常宁市| 永福县| 瓦房店市| 新密市| 尚义县| 青神县| 辰溪县| 渝北区| 称多县|