实现C语言字符串操作函数

1. 概述

C中字符串操作函数包括

  1. size_t strlen(const char *str) 获取字符串str的长度
  2. char *strcpy(char *dest, char *src) 字符串src复制到字符串dest
  3. char *strncpy(char *dest, char *src, size_t n) 字符串src的前n个字符复制到字符串dest
  4. char *strcat(char *dest, char *src) 字符串src拼接到字符串dest后面
  5. char *strncat(char *dest, char *src, size_t n) 字符串src的前n个字符拼接到字符串dest后面
  6. char *strchr(char *str, const int c) 在字符串str中从左侧开始查找字符c,找到则返回以c开始的后续字符串 找不到则返回null
  7. char *strrchr(char *str, const int c) 在字符串str中从右侧开始查找字符c,找到则返回以c开始的后续字符串 找不到则返回null
  8. char *strstr(char *str, const char *substr) 在字符串str中查找子串substr,找到则返回以子串substr开始的后续字符串 找不到则返回null
  9. int strcmp(const char *str1, const char *str2) 对比两个字符串的大小
  10. int strncmp(const char *str1, const char *str2, size_t n) 对比两个字符串前n个字符的大小

2. 实现

2.1 创建my_string.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 实现strlen()
size_t strlen_my(const char *str);
// 实现strcpy()
char *strcpy_my(char *dest, char *src);
// 实现strncpy()
char *strncpy_my(char *dest, char *src, size_t n);
// 实现strcat()
char *strcat_my(char *dest, char *src);
// 实现strncat()
char *strncat_my(char *dest, char *src, size_t n);
// 实现strchr()
char *strchr_my(char *str, const int c);
// 实现strrchr()
char *strrchr_my(char *str, const int c);
// 实现strstr()
char *strstr_my(char *str, const char *substr);
// 实现strcmp()
int strcmp_my(const char *str1, const char *str2);
// 实现strncmp()
int strncmp_my(const char *str1, const char *str2, const size_t n);

2.2 创建my_string.c

#include "book81.h"

// 实现strlen()
size_t strlen_my(const char *str) {
    int i = 0;
    while (str[i] != '\0') {
        i++;
    }
    return i;
}

// 实现strcpy()
char *strcpy_my(char *dest, char *src) {
    int i = 0;
    while (src[i] != '\0') {
        dest[i] = src[i];
        i++;
    }
    dest[i] = '\0';
    return dest;
}

// 实现strncpy
char *strncpy_my(char *dest, char *src, size_t n) {
    // 防止copy越界
    int len = (strlen_my(src) > n) ? n : strlen_my(src);

    int i = 0;
    while (i < len) {
        dest[i] = src[i];
        i++;
    }
    dest[i] = '\0';
    return dest;
}

// 实现strcat()
char *strcat_my(char *dest, char *src) {
    int dest_len = strlen_my(dest);
    int i;
    for (i = 0; i < strlen_my(src); i++) {
        dest[dest_len + i] = src[i];
    }
    dest[dest_len + i] = '\0';
    return dest;
}

// 实现strncat()
char *strncat_my(char *dest, char *src, size_t n) {
    int dest_len = strlen_my(dest);
    int len = (strlen_my(src) > n) ? n : strlen_my(src);
    int i;
    for (i = 0; i < len; i++) {
        dest[dest_len + i] = src[i];
    }
    dest[dest_len + i] = '\0';
    return dest;
}

// 实现strchr() 返回在字符串 str 中第一次出现字符 c 的位置
char *strchr_my(char *str, const int c) {
    int i = 0;
    while (str[i] != '\0') {
        if (str[i] == c)
            return (char *)str + i;
        i++;
    }
    return 0;
}

// 实现strrchr()
char *strrchr_my(char *str, const int c) {
    int i = strlen_my(str) - 1;
    for (; i >= 0; i--) { // 此处不能使用size_t unsigned int 不能与0比较
        if (str[i] == c)
            return (char *)str + i;
    }
    return 0;
}

// 实现strstr()
char *strstr_my(char *str, const char *substr)
{
    char *pos = (char *)str;
    char *cur_pos;
    int flag;
    while (pos[0] != '\0') {
        cur_pos = strchr_my(pos, substr[0]);
        if (!cur_pos)
            return 0;
        if (strncmp_my(cur_pos, substr, strlen_my(substr)) == 0)
            return (char *)cur_pos;
        pos++;
    }
    return 0;
}

// 实现strcmp()
int strcmp_my(const char *str1, const char *str2) {
    int len = (strlen_my(str1) > strlen_my(str2)) ? strlen_my(str2) : strlen_my(str1);
    int i = 0;
    for (; i < len; i++) {
        if (str1[i] == str2[i])
            continue;
        else
            break;
    }

    if ((i == len) && (strlen_my(str1) == strlen_my(str2)))
        return 0;
    if (str1[i] > str2[i])
        return 1;
    else
        return -1;
}

// 实现strncmp()
int strncmp_my(const char *str1, const char *str2, const size_t n) {
    int i = 0;
    for (; i < n; i++) {
        if (str1[i] == str2[i])
            continue;
        else
            break;
    }
    if (i == n)
        return 0;
    if (str1[i] > str2[i])
        return 1;
    else
        return -1;
}

3. 测试

int main() {
    char str1[] = "hahahaha";
    printf("strlen_my: *%d*\n", strlen_my(str1));

    char str2[10];
    strcpy_my(str2, str1);
    printf("strcpy_my: *%s*\n", str2);

    char str3[10];
    strncpy_my(str3, str1, 20);
    printf("strncpy_my: *%s*\n", str3);

    char str4[20] = "heihei";
    strcat_my(str4, str1);
    printf("strcat_my: *%s*\n", str4);

    char str5[20] = "heihei";
    strncat_my(str5, str1, 20);
    printf("strncat_my: *%s*\n", str5);

    printf("strchr_my: *%s*\n", strchr_my(str1, 'e'));

    printf("strrchr_my: *%s*\n", strrchr_my(str1, 'c'));

    char str6[20] = "hahaha";
    printf("strcmp_my: *%d*\n", strcmp_my(str6, str1));

    char str7[20] = "hahahaha";
    printf("strncmp_my: *%d*\n", strncmp_my(str7, str1, 2));

    char str8[20] = "csdcsdhehahcsdcsde";
    char str9[] = "ha";
    printf("strstr_my: *%s*\n", strstr_my(str8, str9));

    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值