首页 > 其他 > 详细

字符串和内存函数的介绍

时间:2021-04-19 23:13:53      阅读:20      评论:0      收藏:0      [点我收藏+]
1.字符串长度

技术分享图片
实现方式

int my_strlen(const char a[]) {
    int i = 0, count = 0;
    while (a[i] != ‘\0‘) {
        count++;
        i++;
}
    return count;
}
int main() {
    char a[] = "abcxccxdef";
    int ret=my_strlen(a);
    printf("%d", ret);
}

技术分享图片

例如:我们来看一下strlen的另一个特点,它的返回值是size-t,是无符号整型,但是我们自己写的是返回的是整型。
技术分享图片
技术分享图片


技术分享图片
技术分享图片

2.strcpy字符串拷贝函数

长度不受限制的字符串函数
1.字符串拷贝函数
2.会拷贝源字符串的‘\0’;也就是会覆盖目标字符串的内容。

技术分享图片

实现方式

char* my_strcpy(char* a, const char* b) {
    char* ret = a;
    //判断b数组起始位置不为‘\0’;
    while (*b != ‘\0‘) {

        *a = *b;
        a++;
        b++;
    }
    //*b 这时指向‘\0’,把它拷贝到a中。
    *a = *b;
    return ret;
}
int main() {
    char a[10] = "abcdef";
    char b[] = "bcdef";
    char* ret=my_strcpy(a, b);
    printf("%s", ret);
    return 0;
}

3.strcat追加字符串函数

技术分享图片
实现方式

char * my_strcat(char* a, const char* b) {
    char* ret = a;
    //遍历数组a,使得a指向‘\0’;
    while (*a != ‘\0‘) {
        *a++;
    }
    //把数组b中的元素追加到a中,此时的a已经指向‘\0.‘
    while (*b != ‘\0‘) {
        *a = *b;
        *a++;
        *b++;
    }
    //此时的b为‘\0‘,把它也追加到a中
    *a = *b;
    return ret;
}
int main() {
    char a[20] = "abcdef";
    char b[] = "wxl";
    char* ret=my_strcat(a, b);
    printf("%s", ret);

    return 0;
}

技术分享图片

4.strcmp字符串比较函数

技术分享图片
技术分享图片
实现方式

int my_strcmp(const char *a, const char *b) {
    while (*a == *b) {
        if (*a == ‘\0‘) {  //相等
            return 0;
        }
        a++;       //相等的情况下继续比较下一对字符。
        b++;

    }
         if (*a > *b) { //大于
            return 1;
        }
         else   
             return -1;  //小于

    }
int main() {
    char a[] = "abcdef";
    char b[] = "abhhhh";
    int ret = my_strcmp(a, b);
    printf("%d", ret);
    return 0;
}

技术分享图片

长度受限制的字符串函数介绍

1.strncpy

技术分享图片
技术分享图片

int main() {
    char a[10] = "hhahadd";
    char b[] = "abcdefghighik";
    strncpy(a, b, 5);
    printf("%s", a);
}

技术分享图片

注意点第二项:
技术分享图片

2.strncat

技术分享图片

技术分享图片

int main() {
    char arr1[30] = "abcdef";
    char arr2[] = "ghijk";
    strncat(arr1, arr2, 3);
    printf("%s", arr1);
}

技术分享图片
技术分享图片

3.strncmp

技术分享图片

 int main() {
    char a[] = "abcdef";
    char b[] = "abcwef";
    int ret = strncmp(a, b, 4);
    printf("%d\n", ret);
}

技术分享图片

字符串查找

1.strstr

技术分享图片
技术分享图片
实现方式
技术分享图片
技术分享图片

char* my_strstr(const char* a, const char* b) {
    char* p1 = (char *)a;
    char* p2 = (char * ) b;
    char* cur = (char * )a;
    while (*cur != ‘\0‘) {
        p1 = cur;  
        p2 = (char * )a;

        while ((*p1 != ‘\0‘) && (*p2 != ‘\0‘) && (*p1 == *p2)) {
            p1++;
            p2++;

        }
                cur++;
                if(*p1=‘\0‘){        //当p1等于‘\0’时,直接终止。
                return NULL;

        if (*p2 == ‘\0‘) {
            return cur;           //当p2为‘\0‘的时候,直接返回cur指向的地址,进行打印;
        }

    }
    return NULL;         //没找到
}
        int main() {
            char a[] = "abbbcefg";
            char b[] = "bbc";
            char* ret = my_strstr(a, b);
            if (ret == NULL) {
                printf("字串不存在");
            }
            else {
                printf("%s", ret);
            }
        }

技术分享图片

2.strtok

技术分享图片

技术分享图片
技术分享图片

3.strerror错误信息报告

技术分享图片

char *str = strerror(errno);

技术分享图片

小写转大写

#include <ctype.h>
int main() {
    int i = 0;
    char a[] = "I Am a Student";
    while (a[i] != ‘\0‘) {
        if (isupper( a[i])) {
            a[i] = tolower(a[i]);
        }
        i++;
    }

    return 0;
}

内存操作函数

1.memcpy

技术分享图片

实现方式

void* my_memcpy(void* dest, const void* str, size_t num) {
    void* ret =dest;
    while (num--) {
        *(char*) dest = *(char* )str;
        ++(char *)dest;
        ++(char *)str;
    }
    return ret;
}
int main() {
    int a[] = { 1,2,3,4,5,6 };
    int b[10] = { 0 };
    my_memcpy(a, b, sizeof(a));
    return 0;
 }

技术分享图片

2.memove

技术分享图片

实现方式
技术分享图片

void* my_memcpy(void* dest, const void* str, size_t num) {
    void * ret = dest;
    if(dest<str){
        //从前往后
        while (num--) {
            *(char*)dest = *(char*)str;
            ++(char *)dest;
            ++(char *)str;
        }
    }
    else {
        //从后-前
        while (num--) {
            *((char *)dest + num) = *((char *)str + num);
        }
    }
    return ret;
}
int main() {
    int a[] = { 1,2,3,4,5,6,7,8,9,10 };
    my_memcpy(a+3, a, 20);
    return 0;
 }

3.memset内存设置函数

技术分享图片

int main() {
    char arr1[10] = "";
    memset(arr1, ‘#‘, 10);  //把arr1重置#号,数量为10个
    printf("%s", arr1);

}

4.memcmp

技术分享图片

int main() {
    int arr1[] = { 1,2,3,4,5,6 };
    int arr2[] = { 1,2,5,6,4,7 };
    int ret = memcmp(arr1, arr2, 8);  //比较前八个字节,也就是两个整型,1和2比较
    printf("%d", ret);
    return 0;
}

字符串和内存函数的介绍

原文:https://blog.51cto.com/u_15100290/2718221

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!