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

學無先后,達者為師

網站首頁 編程語言 正文

一篇文章教你如何用C語言實現strcpy和strlen_C 語言

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

?自己實現strcpy、strlen

strcpy的實現

思路:

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

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

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

優化1:

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

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

優化2:

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

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

優化3:

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

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

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

優化4:

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

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

#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只能修飾關鍵字本身右邊的第一個東西(像int*就直接理解為指針)。const修飾的東西被限制。

優化5:

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

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

總結

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

strlen的實現

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

總結

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

欄目分類
最近更新