C++复习之实现标准库的字符串操作函数

本文详细介绍了C++中标准库的字符串操作函数实现,包括strcpy、strncpy、memmove、memcpy等,并提供了strnicmp函数的具体编码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++复习之实现标准库的字符串操作函数

strcpy 、 strncpy 、 memmove 、 memcpy 、 memset 、 strlen 、 strncat 、 strcmp 、 strncmp 、 strstr 、 strchr 的实现

// The strcpy() function copies the string pointed to by src, including the terminating null byte ('\0'), to the buf
// pointed to by dest. The strings may not overlap, and the destination string dest must be large enough to receive
//copy.
char *strcpy(char *dest, const char *src)
{
    assert((src != NULL) && (dest != NULL));
    size_t i;
    for (i = 0; src[i] != '\0'; i++)
    dest[i] = src[i];
    dest[i] = '\0';
    return dest;
}
// The strncpy() function is similar, except that at most n bytes of src are copied. Warning: If there is no null byte am
the first n bytes of src,
// the string placed in dest will not be null-terminated. If the length of src is less than n, strncpy() pads the remainde
dest with null bytes.
char *strncpy(char *dest, const char *src, size_t n)
{
    assert((src != NULL) && (dest != NULL));
    size_t i;
    for (i = 0; i < n && src[i] != '\0'; i++)
    dest[i] = src[i];
    for (; i < n; i++)
    dest[i] = '\0';
    return dest;
}
/*  在 32 位的 x86 平台上 , 每次拷贝 1 个字节需要一条指令 , 每次拷贝 4 个字节也只需要一条指
 *  令 ,memcpy 函数的实现尽可能 4 个字节 4 个字节地拷贝 */
void *memcpy(void *dest, const void *src, size_t n) {
    assert((src != NULL) && (dest != NULL));
    char *d = dest;
    const char *s = src;
    int *di;
    const int *si;
    int r = n % 4;
    while (r--)
        *d++ = *s++;
    di = (int *) d;
    si = (const int *) s;
    n /= 4;
    while (n--)
        *di++ = *si++;
    return dest;
}
/*  借助于一个临时缓冲区 temp , 即使 src  和 dest  所指的内存区间有重叠也能正确拷贝。 */
void *memmove(void *dest, const void *src, size_t n) {
    assert((src != NULL) && (dest != NULL));
    char *temp = (char *) malloc(sizeof(char) * n);
    size_t i;
    char *d = (char *) dest;
    const char *s = (const char *) src;
    for (i = 0; i < n; i++)
        temp[i] = s[i];
    for (i = 0; i < n; i++)
        d[i] = temp[i];
    free(temp);
    return dest;
}
size_t strlen(const char *p) {
    assert(p != NULL);
    size_t size = 0;
    while (*p++ != '\0')
        ++size;
    return size;
}
char *strncat(char *dest, const char *src, size_t n) {
    size_t dest_len = strlen(dest);
    size_t i;
    for (i = 0; i < n && src[i] != '\0'; i++)
        dest[dest_len + i] = src[i];
    dest[dest_len + i] = '\0';
    return dest;
}

不用临时空间的 memmove 实现:

//src 可以不保留
void *memmove(void *dst, const void *src, size_t count) {
    byte *pbTo = (byte *) dst;
    byte *pbFrom = (byte *) src;
    assert(dst != NULL && src != NULL); // 不能存在空指针
    if (dst <= src || pbTo >= pbFrom + count) //
            {
        while (count-- > 0) {
            *pbTo++ = *pbFrom++; // 按递增拷贝
        }
    } else //
    {
        pbTo = pbTo + count - 1; //overlap 的情况,从高位地址向低位拷贝
        pbFrom = pbFrom + count - 1;
        while (count-- > 0) {
            *pbTo-- = *pbFrom--; // 按递减拷贝
        }
    }
    return dst;
}

memset 的实现 :

void *memset(void *buffer, int c, int count) {
    char *buffer_p = (char *) buffer;
    assert(buffer != NULL);
    while (count-- > 0)
        *buffer_p++ = (char) c;
    return buffer;
}
// 查找字符串 s 中首次出现字符 c 的位置
char *strchr(char *str, int c) {
    assert(str != NULL);
    for (; *str != (char) c; ++str)
        if (*str == '\0')
            return NULL;
    return str;
}
// 字符串连接
char *strcat(char *strDes, const char *strSrc) {
    assert((strDes != NULL) && (strSrc != NULL));
    char *address = strDes;
    while (*strDes != '\0')
        ++strDes;
    while ((*strDes++ = *strSrc++) != '\0')
        NULL;
    *StrDes = '\0';
    return address;
}
// 查找字符串第一次出现的位置
char *strstr(const char *strSrc, const char *str) {
    assert(strSrc != NULL && str != NULL);
    const char *s = strSrc;
    const char *t = str;
    for (; *strSrc != '\0'; ++strSrc) {
        for (s = strSrc, t = str; *t != '\0' && *s == *t; ++s, ++t)
            NULL;
        if (*t == '\0')
            return (char *) strSrc;
    }
    return NULL;
}
// 字符串比较
int strcmp(const char *s, const char *t) {
    assert(s != NULL && t != NULL);
    while (*s && *t && *s == *t) {
        ++s;
        ++t;
    }
    return (*s - *t);
}
int strncmp(const char *s, const char *t, int count) {
    assert((s != NULL) && (t != NULL));
    while (count-- > 0 && *s && *t && *s == *t) {
        ++s;
        ++t;
    }
    return (*s - *t);
}

请使用C语言完成strnicmp的编码实现,要求不能调用任何其它的函数。strcnicmp完成两个ascii字符串的比较,忽略大小写
(两个英文字母比较时,认为大小写无差别),最多比较n个字符(当两个字符串长度超过n时,就认为它们的长度都等于
n),返回<0表示第一个字符串小于第二个字符串,返回>0表示第一个字符串大于第二个字符串,返回等于0时表示两个字符
串相等。函数声明如下:int strnicmp(char const *s1, char const *s2, int n)

int strnicmp(char const *s1, char const *s2, int n) {
    int i;
    for (i = 0; i < n; i++) {
        char a = s1[i], b = s2[i];
        if (a >= 'A' && a <= 'Z')
            a = a - 'A' + 'a';
        if (b >= 'A' && b <= 'Z')
            b = b - 'A' + 'a';
        if (a == b)
            continue;
        return a - b;
    }
    return 0;
}
内容概要:本文档详细介绍了基于MATLAB实现多目标差分进化(MODE)算法进行无人机三维路径规划的项目实例。项目旨在提升无人机在复杂三维环境中路径规划的精度、实时性、多目标协调处理能力、障碍物避让能力和路径平滑性。通过引入多目标差分进化算法,项目解决了传统路径规划算法在动态环境和多目标优化中的不足,实现了路径长度、飞行安全距离、能耗等多个目标的协调优化。文档涵盖了环境建模、路径编码、多目标优化策略、障碍物检测与避让、路径平滑处理等关键技术模块,并提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,对无人机路径规划和多目标优化算法感兴趣的科研人员、工程师和研究生。 使用场景及目标:①适用于无人机在军事侦察、环境监测、灾害救援、物流运输、城市管理等领域的三维路径规划;②通过多目标差分进化算法,优化路径长度、飞行安全距离、能耗等多目标,提升无人机任务执行效率和安全性;③解决动态环境变化、实时路径调整和复杂障碍物避让等问题。 其他说明:项目采用模块化设计,便于集成不同的优化目标和动态环境因素,支持后续算法升级与功能扩展。通过系统实现和仿真实验验证,项目不仅提升了理论研究的实用价值,还为无人机智能自主飞行提供了技术基础。文档提供了详细的代码示例,有助于读者深入理解和实践该项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值