博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言:模拟实现strncpy、strncat、strncmp、strrchr函数
阅读量:2242 次
发布时间:2019-05-09

本文共 2963 字,大约阅读时间需要 9 分钟。

目录:

strncpy、strncat、strncmp函数与strcpy、strcat、strcmp函数非常相似,实现的功能也差不多。但strncpy、strncat、strncmp函数要比strcpy、strcat、strcmp函数更安全。因为在c语言string库中,strcpy,strcat,strcmp这三个函数是通过自身的长度来终止循环的,在一些条件下很不安全,比如:在strstr函数中,给arr自身后面追加arr,程序就会崩溃。

因此,就又引入了strncpy、strncat、strncmp这几个函数,这几个函数是比strcpy,strcat,strcmp多一个参数,size_t count,该参数表示字节,也就是可以限制拷贝的字节数,并且一般情况下,strncpy、strncat、strncmp这几个函数是以’\0’来终止循环的,这样就避免了程序找不到终止条件,从而崩溃掉的现象。并且strncpy、strncat函数会自动在最终结果的末尾加上’\0’。

strncpy函数
#include 
#include
#include
char *my_strncpy(char *dest, char *str, int count){ char *ret = dest; assert(dest && str); while (count-- && *str) { *dest++ = *str++; } while (count >= (int)strlen(str)) { *dest = '\0'; dest++; count--; } return ret;}int main(){ char arr1[100] = "asdsadvsvawewefaw"; char arr2[] = "hello world"; printf("%s\n", strncpy(arr1, arr2, strlen(arr2))); return 0;}

结果:hello world

strncat函数
#include 
#include
#include
char *my_strncat(char *dest, const char *str, int count) { char *ret = dest; assert(dest && str); while (*dest) { dest++; } while (count-- && *str) { *dest++ = *str++; } *dest = '\0'; return ret; } int main() { char arr1[100] = "abcdef"; char arr2[] = "ghijk"; printf("%s\n", my_strncat(arr1, arr2, strlen(arr2))); return 0; }

结果:abcdefghijk

strncmp
#include 
#include
#include
int my_strncmp(const char *dest, const char *str, int count) { assert(dest && str); while (count--) { if (*dest == *str) { dest++; str++; } else { if (*dest > *str) { return 1; } else { return -1; } } } return 0; } int main() { char arr1[] = "hello"; char arr2[] = "hello"; printf("%d\n", my_strncmp(arr1, arr2, strlen(arr1))); return 0; }

结果:0

strrchr

strchr查找字符串s中首次出现字符c的位置,返回首次出现c的位置的指针

strrchr查找字符串s中最后一次出现字符c的位置,返回最后一次出现c的位置的指针

#include 
#include
#include
char *my_strrchr(char *str, char c) { char *ret = NULL; assert(str); int count = strlen(str); while (count--) { if (*(str + count) == c) { ret = str + count; return ret; } } return 0; } int main() { char arr1[] = "abbcdefbbdeefg"; char c = 'b'; printf("%s\n", my_strrchr(arr1, c)); return 0; }

结果:bdeefg

实际上strncpy、strncat、strncmp函数的代码基本上没变,只是判断条件变了。只有能够知道函数的实现原理,明白函数的功能,在模拟实现的时候才会简单一点

转载地址:http://obwdb.baihongyu.com/

你可能感兴趣的文章
Oracle_spatial的空间操作符
查看>>
SDO_GEOMETRY结构说明
查看>>
oracle 的 SDO_GEOMETRY
查看>>
往oracle中插入geometry的两种方式
查看>>
Oracle Spatial中的Operator操作子 详细说明
查看>>
Oracle Spatial中SDO_Geometry详细说明
查看>>
oracle 聚合函数 LISTAGG ,将多行结果合并成一行
查看>>
Oracle列转行函数 Listagg() 语法详解及应用实例
查看>>
LISTAGG函数的用法
查看>>
Oracle Spatial操作geometry方法
查看>>
IDEA类和方法注释模板设置(非常详细)
查看>>
Java程序初始化的顺序
查看>>
Dubbo和Spring结合配置文件内容解析为bean的过程
查看>>
fastJson注解@JSONField使用的一个实例
查看>>
fastjson的@JSONField注解的一点问题
查看>>
fastjson使用(三) -- 序列化
查看>>
浅谈使用单元素的枚举类型实现单例模式
查看>>
Java 利用枚举实现单例模式
查看>>
Java 动态代理作用是什么?
查看>>
Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM) (清晰,浅显)
查看>>