/**
查找字符串 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. android用TextView实现跑马灯效果

    今天搞啦很久,其实很简单,就加几个属性就可以啦! 图如下 : 有的说要重写TextView方法,有的说要设置固定长度,但是我没重写也没有设置固定长度也弄出来啦!跑在2.3.3的手机上面.就是不知道其他 ...

  2. Atitti mybatis的单元测试attilax总结

    Atitti mybatis的单元测试attilax总结 版本mybatis 3.2.4 /palmWin/src/main/java/com/attilax/dao/mybatisTest.java ...

  3. Socket网络编程--聊天程序(9)

    这一节应该是聊天程序的最后一节了,现在回顾我们的聊天程序,看起来还有很多功能没有实现,但是不管怎么说,都还是不错的.这一节我们将讲多服务器问题(高大上的说法就是负载问题了.)至于聊天程序的文件发送(也 ...

  4. 《转》vue更新到2.0之后vue-resource不在更新,axios的使用

    vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,前一段时间用了一下,现在说一下它的基本用法. 首先就是引入axios,如果你使用es6,只需要安装axios ...

  5. golang:mime.Decode、mime.DecodeHeader

    最近在做邮件解析的相关工作,在使用mime.Decode/mime.DecodeHeader时有些疑问. 有些搞不懂mime.Encode和mime.EncodeHeader的区别.

  6. java框架篇---hibernate之CRUD操作

    CRUD是指在做计算处理时的增加(Create).读取(Retrieve)(重新得到数据).更新(Update)和删除(Delete)几个单词的首字母简写. 下面列举实例来讲解这几个操作: 实体类: ...

  7. Java知多少(20)变量的作用域

    在Java中,变量的作用域分为四个级别:类级.对象实例级.方法级.块级. 类级变量又称全局级变量或静态变量,需要使用static关键字修饰,你可以与 C/C++ 中的 static 变量对比学习.类级 ...

  8. Qt库版查询

    1 背景 在为嵌入式产品开发Qt应用时,开发所使用的Qt库要和嵌入式系统所支持的Qt库版本一致,否则开发的App无法正确运行.那么,如何查询一个嵌入式系统中所安装Qt库的版本呢?下面将进行一些总结. ...

  9. linux-centos下持续集成工具jenkins部署使用教程

    centos下准备工作: 1.安装jdk环境 2.安装maven环境(用于构建项目) 3.git客户端(用于拉取源码) 此外码云还要准备一份java源码(springboot项目) 一.安装jenki ...

  10. [Localization] R-CNN series for Localization and Detection

    CS231n Winter 2016: Lecture 8 : Localization and Detection CS231n Winter 2017: Lecture 11: Detection ...