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

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值