/**
查找字符串 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. 使用dstat命令的插件查看mysql的io状态

    使用dstat竟然还可以查看mysql的状态, man dstat之后发现的,原来在/usr/share/dstat目录下藏有很多python脚本作为插件帮助dstat搜集各类信息. 不过通常有可能会 ...

  3. 9.5 翻译系列:数据注解之ForeignKey特性【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code ...

  4. Ansible 使用普通用户远程执行playbook

    设置ansible使用普通用户jsxge远程连接执行playbook 1. ansible控制端创建普通用户jsxgecd /homeuseradd jsxgechown -R jsxge.wheel ...

  5. runtime MethodSwizzle 实践之扩展 NIAttributedLabel

    runtime MethodeSwizzle 提供 简单的方法交换已知类的  Method IMP. Method 可以是 外部可访问的 public 或者 private Method .所谓的属性 ...

  6. Atitit 数据库 标准库  sdk 函数库 编程语言 mysql oracle  attilax总结

    Atitit 数据库 标准库  sdk 函数库 编程语言 mysql oracle  attilax总结 1.1. 常见的编程语言以及数据库 sql内部函数库标准化库一般有以下api1 1.2. 各个 ...

  7. [svc]cfssl模拟https站点-探究浏览器如何校验证书

    准备cfssl环境 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl wget https://pkg ...

  8. ECMAScript 6 入门之新的数据类型Symbol

    1.Symbol,一个每次创建都不一样的值 Symbol undefined null Boolean String Number Object let c=Symbol("这是一个Symb ...

  9. AI金融知识自学偏量化方向-了解不同类型的机器学习2

    有监督学习 vs 无监督学习 迭代和评估 偏差方差权衡 结合有监督学习和无监督学习(半监督学习)

  10. Java编程的逻辑 (81) - 并发同步协作工具

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...