日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

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

作者:黎丶辰 ? 更新時間: 2022-03-24 編程語言

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

strcpy的實(shí)現(xià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止條件是賦值到了絕對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;
}
//自己實(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 使得我們的原來的數(shù)據(jù)不能被拷貝數(shù)據(jù)不能進(jìn)行修改。從強(qiáng)制檢測。另一方面解釋:源頭的數(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;
}

對于const的講解

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

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

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

在第三行中:兩邊都進(jìn)行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)驗(yàn)就是,在對地址進(jìn)行操作之前先提前備份一份。然后將備份的這個地址位置返回即可。

#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è)計(命名,類型),返回值的情況。
    2. 關(guā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);//用來保證指針的有效性
    while(*str !='\0'){
        count++;
        str++;
    }
    return count;
}

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

總結(jié)

原文鏈接:https://blog.csdn.net/Tian_baby/article/details/122355246

欄目分類
最近更新