国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 一篇文章帶你實現C語言中常用庫函數的模擬

一篇文章帶你實現C語言中常用庫函數的模擬

2022-01-11 14:4508-08 C/C++

這篇文章主要介紹了C語言中常用庫函數的模擬,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言

C語言中對字符和字符串的處理很是頻繁,但是C語言本身是沒有字符串類型的,字符串通常放在常量字符串中或者字符數組中。 字符串常量適用于那些對它不做修改的字符串函數。

函數介紹

strlen(求字符串長度)

size_t strlen ( const char * str );

  • 字符串已經'\0'作為結束標志,strlen函數返回的是在字符串中'\0'前面出現的字符個數(不包含'\0')。
  • 參數指向的字符串必須要以'\0'結束。
  • 函數的返回值為size_t,是無符號的。

模擬實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
size_t my_strlen(char* arr) {
    int count = 0;
    while (*arr) {
        arr++;
        count++;
    }
    return count;
}
int main() {
    char arr[] = "abcdef";
    size_t ret=my_strlen(arr);
    printf("%u\n", ret);
    return 0;
}

strcpy(字符串拷貝)

char* strcpy(char * destination, const char * source );

  • 源字符串必須以'\0'結束。
  • 會將源字符串中的'\0'拷貝到目標空間。
  • 目標空間必須足夠大,以確保能存放源字符串。
  • 目標空間必須可變。

模擬實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
#include<assert.h>
char * my_strcpy(char* arr,const char* arr1) {
    assert(arr && arr1);
        char* ret = arr;
    while (*arr++ = *arr1++) {
        ;
    }
 return ret;
}
int main() {
    char arr[] = "xxxxxxxxxxxxxxx";
    char arr1[] = "abcd";
    my_strcpy(arr, arr1);
    printf("%s\n", arr);
    return 0;
}

strcat(字符串追加)

char * strcat ( char * destination, const char * source );

  • 源字符串必須以'\0'結束。
  • 目標空間必須足夠的大,能容納下源字符串的內容。
  • 目標空間必須可修改。

模擬實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src) {
    assert(dest && src);     //斷言-保護dest和src指針都不為空
    char* ret = dest;         //保存目標字符串的首地址
    //找到目標字符串的末尾\0
    while (*dest) {
        dest++;
    }
    //把源字符串追加到目標字符串直到\0為止
    while (*dest++ = *src++) {
        ;
    }
    return ret;
}
int main() {
    char arr[20] = "abc";
    char arr1[] = { 'd','e','f','\0' };
    printf("%s\n", my_strcat(arr, arr1));//把arr1數組中的內容追加到arr數組中
    return 0;
}

strcmp(字符串比較)

int strcmp ( const char * str1, const char * str2 );

  • 第一個字符串大于第二個字符串,則返回大于0的數字。
  • 第一個字符串等于第二個字符串,則返回0。
  • 第一個字符串小于第二個字符串,則返回小于0的數字

模擬實現:

比較的是字符串的內容,不是字符串的長度

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* a, const char* b) {
    assert(a && b);
    while (*a == *b) {
        if (*a == '\0')
            return 0;
        a++;
        b++;
    }
    return *a - *b;
}
int main() {
    char a[] = "abc";
    char b[] = "abcq";
    int ret=my_strcmp(a, b);
    if (ret > 0)
        printf(">\n");
    else if (ret == 0)
        printf("=\n");
    else
        printf("<\n");
    return 0;
}

strstr(找子字符串)

char * strstr ( const char *, const char * );

  • 在一個字符串中查找另一個字符串是否存在
  • 查找源字符串在目標字符串中第一次出現的位置

模擬實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* dest,const char* src) {
    assert(dest && src);
    char* s1=dest;
    char* s2=src;
    if (*src == '\0')
        return dest;
    while (*s1) {
        dest = s1;
        src = s2;
        while (*dest!='\0'&&*src!='\0'&&*dest == *src) {
            dest++;
            src++;
        }
        if (*src == '\0')
            return s1;
        s1++;
    }
    return NULL;
}
int main() {
    char arr[] = "I am a students";
    char arr1[] = "am";
    char *ret=my_strstr(arr, arr1);
    if (ret == NULL)
        printf("找不到");
    else
        printf("%s\n", ret);
    return 0;
}

圖解:

一篇文章帶你實現C語言中常用庫函數的模擬

memcpy(內存拷貝)

void * memcpy ( void * destination, const void * source, size_t num );

  • 函數memcpy從source的位置開始向后復制num個字節的數據到destination的內存位置。
  • 這個函數在遇到'\0'的時候并不會停下來。
  • 如果source和destination有任何的重疊,復制的結果都是未定義的。

模擬實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t count) {
    assert(dest && src);
    void * ret = dest;
    while (count--) {
        *(char*)dest = *(char*)src;
        dest=(char *)dest+1;
        src=(char *)src+1;
    }
    return ret;
}
int main() {
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int arr1[20] = { 0 };
    my_memcpy(arr1, arr, 10 * sizeof(int));
    for (int i = 0; i < 20; i++) {
        printf("%d ", arr1[i]);
    }
    printf("\n");
    return 0;
}

memmove(內存移動)

void * memmove ( void * destination, const void * source, size_t num );

  • 和memcpy的差別就是memmove函數處理的源內存塊和目標內存塊是可以重疊的。
  • 如果源空間和目標空間出現重疊,就得使用memmove函數處理。

模擬實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t count) {
    assert(dest && src);
    void* ret = dest;
    //從前往后
    if (dest < src) {
        while (count--) {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
        }
    }
    //從后往前
    else {
        while (count--) {
            *((char*)dest + count) = *((char*)src + count);
        }
    }
    return ret;
}
int main() {
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    my_memmove(arr + 2, arr, 16);
    for (int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}

圖解:

一篇文章帶你實現C語言中常用庫函數的模擬

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/m0_46468731/article/details/120416337

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
主站蜘蛛池模板: 最新电影在线高清免费完整观看视频 | 国产麻豆乱码精品一区二区三区 | 99精品欧美一区二区三区综合在线 | 国产精品久久久久久久久软件 | 国产精品爱久久久久久久 | 欧美午夜精品久久久久久浪潮 | 久久久精品综合 | 日日夜夜精品视频 | 一大道一二三区不卡 | 91精品福利 | 91麻豆精品国产91久久久更新资源速度超快 | 久久久免费 | 国产日韩欧美 | 欧美一区视频 | 三级黄色片在线免费观看 | 一区二区三区久久 | 欧美一区第一页 | 观看av| 欧美成人激情 | av片在线观看 | 亚洲激情在线 | 久久久精| 久久成人av | 亚洲视屏| 亚洲国产精品99久久久久久久久 | 日日摸夜夜添夜夜添高潮视频 | 欧美综合影院 | 亚洲毛片| 一区二区三区动漫 | 日韩成人在线视频 | 国内精品久久久久久中文字幕 | 精品久久久久一区二区国产 | 精品国产仑片一区二区三区 | 国产美女在线播放 | 日韩av一区二区在线观看 | 91精品国产人妻国产毛片在线 | 久久99精品久久久 | 久久国内免费视频 | 亚洲欧美激情精品一区二区 | 亚洲人人看 | 一区二区三区高清不卡 |