/**
查找字符串 source 中 是否有指定的子串出现,如果有返回第一个匹配的字符 @param source 源
@param chars 目标
@return 返回值
*/
char *find_char0(char const *source, char const *chars) {
if (source == NULL || chars == NULL) {
return NULL;
}
char const *sc1, *sc2;
for (sc1 = source; *sc1 != '\0'; ++sc1) {
for (sc2 = chars; *sc2 != '\0'; ++sc2) {
if (*sc1 == *sc2) {
return (char *)sc1;
}
}
}
return NULL;
} /**
字符串copy 实现 @param dest 目的字符串指针
@param src 源字符串指针
@return 返回值
*/
char *strcpy_(char *dest, const char *src){
char *ret = dest;
assert(dest != NULL);
while ((*dest++ = *src++)) {
;
}
return ret;
} /**
字符串拼接 @param dest 目标字符串指针
@param src 源字符串指针
@return 目标字符串作为返回值
*/
char *strcat_(char *dest, const char *src) {
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
//找到dest指向字符串的末尾 '\0'
while (*dest != '\0') {//注意此处while 不能写成(*dest++ != '\0'),因为一个循环结束前又++操作会跳过 '\0'
dest++;
} //拷贝src指向的内容
while ((*dest ++ = *src++)) {
;
} return ret;
} /**
查找一个字符中是否包含某一子串 @param str 给定的长字符串
@param substr 子串
@return 是否包含子串 不包含返回NULL 包含非NULL
*/
char *strstr_(const char *str, const char *substr){
assert(str != NULL);
assert(substr != NULL); if (*substr == '\0') {
return str;
}
while (*str) {
const char *s1 = str;
const char *s2 = substr;
while (*s1 && *s2 && *s1 == *s2) {
s1++;
s2++;
}
if (*s2 == '\0') {//遍历到s2结尾
return str;//返回str 因为 str 记录了初始值的位置
}
str++;
}
return NULL; } /**
字符串比较 @param str1 字符串1
@param str2 字符串2
@return 比较结果 >0 = 0 <0
*/
int strcmp_(const char* str1, const char *str2){
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1 == *str2) {
if (*str1 == '\0') {
return 0;
}
str1++;
str2++;
}
//*str1 > *str2,返回值大于0 ,*str1 = *str2,返回值等于0 ,*str1 < *str2,返回值小于0
return *str1 - *str2;
} /**
内存拷贝 @param dest 目标位置
@param src 源位置
@param count 长度 字节为单位
@return 目的位置地址
*/
char *memcpy_(void *dest, const void *src, size_t count) {
void *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (count) {
*(char*)dest = *(char*)src;
dest = (char*)dest+1;
src = (char*)src+1;
count--;
}
return ret;
} /**
反向拷贝 @param dest 目的地址
@param src 源地址
@param count 长度 字节为单位
@return 过程函数,无返回值
*/
void *memmove_(void *dest, void *src, size_t count) {
void *ret = dest;
char *str1 = (char*)dest;
char *str2 = (char*)src;
assert(dest != NULL);
assert(src != NULL);
if (str1 > str2) {
while (count--) {
*(str1 + count) = *(str2 + count);
}
}else {
while (count--) {
*str1++ = *str2++;
}
}
return ret;
} /**
反转字符串实现,不借助新的数组 @param s 字符串
@return 反转后的字符串
*/
void *strrev(char *s) {
//h指向s的头部
char *h = s;
char *t = s;
char ch; //t指向s的尾部
while(*t++){};
t--;//与t++抵消
t--;//往回跳过结束符 '\0' //当h 和 t未重合时,交换它们所指向的字符
while (h<t) {
ch = *h;
*h++ = *t;
*t-- = ch;
}
return s;
}

C常用的字符串函数实现的更多相关文章

  1. oc语言常用的字符串函数

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...

  2. MYSQL常用的字符串函数

    #字符串函数 #返回字符串的字符数量,对于此例而言,结果为5SELECT CHAR_LENGTH('计算机编程'); #合并字符串,对于此例而言,结果为‘我喜欢计算机’SELECT CONCAT('我 ...

  3. php中比较复杂但又常用的字符串函数

    php系统核心库自带的函数中,字符串比数组函数较为简单,但还是有一些较为复杂但又很常用的函数,比如下面的这些函数 explode()函数 用一个字符串来分割另一个字符串,返回结果是一个数组 explo ...

  4. php常用的字符串函数

    addslashes -- 使用反斜线引用字符串 chr -- 返回相对应于 ascii 码值所指定的单个字符. chunk_split -- 将字符串分割成小块 count_chars --  返回 ...

  5. mysql中常用的字符串函数

    写在分割线之前,个人以为,数据库应该具备简单的的数据加工能力.如同食品在吃之前,是要经过很多到工序的,有经过初加工.粗加工.精加工.深加工等.那么mysql也应该并必须担任起数据初加工以及粗加工的责任 ...

  6. 常用的字符串函数-S

    header('content-type:text/html;charset=utf-f'); /* $var=addslashes($_GET['username']);//转义表单提交内容中的引号 ...

  7. 【C】常用的字符串函数

    1. strcpy 函数名:strcpy 用法:char *strcpy(char *destin, char *cource) 功能:将一个字符串从一个拷贝到另外一个 程序示例: #include ...

  8. 一些常用的字符串函数(CLR函数)

    原代码来自:东莞--小小大神 使用 --聚合函数 SELECT father_key,dbo.String_Agg(department_name) FROM dbo.b_department GRO ...

  9. 常用C字符串函数

    static void str_repalce(char *src,char *from,char *to) {     char *p,*q;     int lenFrom;     int le ...

随机推荐

  1. 12C -- ORA-01017

    本地使用使用sqlplus,尝试连接12.2数据库报错: 在另外一台服务器上,使用sqlplus连接该库,可以成功: 解决方案: 根据MOS文档id:207303.1看出,只有11.2.0.3之上的客 ...

  2. oracle本地编译问题

    oracle10.2: --将过程重新编译为本地编译方式,提示有编译错误,经查提示未设置plsql_native_library_dir 参数 SQL> alter procedure p_xx ...

  3. 【Linux】深入理解Linux中内存管理

    主题:Linux内存管理中的分段和分页技术 回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址. 如果这个系统只运行一个程序,那么只要这个 ...

  4. SpringMVC(Springboot)返回文件方法

    https://blog.csdn.net/Lynn_coder/article/details/79953977 ****************************************** ...

  5. 灯箱效果插件Magnific Popup详解

    Magnific Popup 是一个非常优秀的弹出对话框或者灯箱效果插件.它基于jQuery(zepto)开发,使用非常简单,特点就是:非常好用. 官网地址: http://dimsemenov.co ...

  6. 3. ELMo算法原理解析

    1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...

  7. PentesterLab渗透演练平台

    转载自: https://www.blackh4t.org/archives/1143.html http://www.91ri.org/5958.html     1.  什么是WebApp Pen ...

  8. Entity Framework定义外键,限制通过migration命令自动更改字段名称

    1.问题 在定义一个表的外键时,通过add-migration命令生成,并通过update-database更新到数据库,发现外键名称发生了重命名.举例说明: 人员表[User](Id,Name,Pa ...

  9. Java知多少(81)框架窗口基础

    窗口是GUI编程的基础,小应用程序或图形界面的应用程序的可视组件都放在窗口中,在GUI中,窗口是用户屏幕的一部分,起着在屏幕中一个小屏幕的作用.有以下三种窗口: Applet窗口:Applet类管理这 ...

  10. 深度学习的batch_size

    知乎讨论: https://www.zhihu.com/question/61607442/answer/204675996 案例一 http://www.myzaker.com/article/5a ...