欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

strcpy的實(shí)現(xiàn)

思路:

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

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

//自己實(shí)現(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直接在表達(dá)式中自加,先試用后加所以使用后置++

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

優(yōu)化2:

在while循環(huán)中,因?yàn)樽詈蟮慕K止條件是賦值到了絕對(duì)0的時(shí)候停止循環(huán)。那么最后一次賦值就是賦值0。那我們直接可以將賦值作為我們的終止條件。

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

優(yōu)化3:

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

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

#include <assert.h>
void my_strcpy(char* dest, char* src){
    assert(dest != NULL);
    assert(src != NULL);
    while (*dest++ = *src++);
    *dest = *src;
}
//自己實(shí)現(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 使得我們的原來(lái)的數(shù)據(jù)不能被拷貝數(shù)據(jù)不能進(jìn)行修改。從強(qiáng)制檢測(cè)。另一方面解釋:源頭的數(shù)據(jù)的安全性得到保證。

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

對(duì)于const的講解

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

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

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

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

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

優(yōu)化5:

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

#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'進(jìn)行賦值。
    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'進(jìn)行賦值。
    return res;
}

總結(jié)

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

strlen的實(shí)現(xiàn)

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

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

總結(jié)

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

相關(guān)文章

  • C語(yǔ)言指針類型與野指針引起的原因

    C語(yǔ)言指針類型與野指針引起的原因

    我們C語(yǔ)言獨(dú)一無(wú)二的特色——指針。說(shuō)起指針,可能很多人都是還沒(méi)學(xué)就已經(jīng)聽(tīng)說(shuō)過(guò)其鼎鼎大名,因?yàn)橛泻芏鄠餮院屯嫘κ裁吹恼f(shuō)指針很難,其實(shí)大家大可不必有畏難情緒,指針這個(gè)東西雖然確實(shí)有一定難度,但是這是基于其優(yōu)秀的靈活性而衍生的一點(diǎn)小問(wèn)題
    2023-02-02
  • Linux環(huán)境g++編譯GDAL動(dòng)態(tài)庫(kù)操作方法

    Linux環(huán)境g++編譯GDAL動(dòng)態(tài)庫(kù)操作方法

    下面小編就為大家?guī)?lái)一篇Linux環(huán)境g++編譯GDAL動(dòng)態(tài)庫(kù)操作方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • C語(yǔ)言中 & 和 &&的區(qū)別詳解

    C語(yǔ)言中 & 和 &&的區(qū)別詳解

    這篇文章主要介紹了C語(yǔ)言中 & 和 &&的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C語(yǔ)言基于EasyX實(shí)現(xiàn)貪吃蛇

    C語(yǔ)言基于EasyX實(shí)現(xiàn)貪吃蛇

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言基于EasyX實(shí)現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語(yǔ)言的空類型指針,空指針,野指針詳解

    C語(yǔ)言的空類型指針,空指針,野指針詳解

    這篇文章主要介紹了C語(yǔ)言的空類型指針,空指針,野指針的詳解及用法示例,介紹了其相關(guān)概念,然后分享了幾種用法,具有一定參考價(jià)值。需要的朋友可以了解下。
    2021-09-09
  • C++的程序流程結(jié)構(gòu)你了解多少

    C++的程序流程結(jié)構(gòu)你了解多少

    這篇文章主要為大家詳細(xì)介紹了C++的程序流程結(jié)構(gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C語(yǔ)言深入探究斐波那契數(shù)列

    C語(yǔ)言深入探究斐波那契數(shù)列

    斐波那契數(shù)一般指斐波那契數(shù)列。 斐波那契數(shù)列(Fibonacci sequence),又稱黃金分割數(shù)列,因數(shù)學(xué)家萊昂納多·斐波那契(Leonardo Fibonacci)以兔子繁殖為例子而引入,故又稱為兔子數(shù)列
    2022-05-05
  • C++?類模板與成員函數(shù)模板示例解析

    C++?類模板與成員函數(shù)模板示例解析

    這篇文章主要為大家介紹了C++?類模板與成員函數(shù)模板示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • C++?IO設(shè)備讀寫功能實(shí)現(xiàn)詳解

    C++?IO設(shè)備讀寫功能實(shí)現(xiàn)詳解

    C++的文件IO(Input,Output)操作就是指對(duì)文件進(jìn)行讀寫(輸入與輸出)的操作。輸入就是從磁盤上的文件中讀取內(nèi)容到內(nèi)存中。輸出就是將內(nèi)存中的數(shù)據(jù)內(nèi)容輸出或者說(shuō)寫入到磁盤的文件中,這篇文章主要介紹了C++?IO設(shè)備讀寫功能實(shí)現(xiàn)
    2022-11-11
  • C語(yǔ)言創(chuàng)建鏈表錯(cuò)誤之通過(guò)指針參數(shù)申請(qǐng)動(dòng)態(tài)內(nèi)存實(shí)例分析

    C語(yǔ)言創(chuàng)建鏈表錯(cuò)誤之通過(guò)指針參數(shù)申請(qǐng)動(dòng)態(tài)內(nèi)存實(shí)例分析

    這篇文章主要介紹了C語(yǔ)言創(chuàng)建鏈表錯(cuò)誤之通過(guò)指針參數(shù)申請(qǐng)動(dòng)態(tài)內(nèi)存,是鏈表創(chuàng)建過(guò)程中非常常見(jiàn)的經(jīng)典錯(cuò)誤。實(shí)例中做了較為詳盡的分析,需要的朋友可以參考下
    2014-09-09

最新評(píng)論