strlen strncat strstr 三种库函数的代码实现

首先我们来看strlen函数,它主要是求一个字符串的长度,所以返回的应该是int型类型,其主要方法是将字符串从头到尾进行遍历时进行计数,因此实现起来并不是很难,其主要函数代码如下:

int length(char *p)

{

int len = 0;

while (*p != 0)

{

len++;

p++;

}

return len;

因为字符长度是不包括‘\0’,所以返回时不用进行+1操作。

然后是关于strncat函数的实现,它主要是对两个字符串进行有个数的连接,注意,是有个数的连接,这也是它和strcat不同的地方,strcat是将整个字符串追加到另一个字符串上,不够灵活。strncat的主要函数方法就是通过指针赋值的方法将源操作数追加到目的操作数上,当然这里的目的操作数必须是有足够空间的,是能够存放下你所给的字符串长度才行。

具体的代码如下:

void *my_strncat(char *dest, const char *src, int k)

{

assert(dest);

assert(src);

char *tmp = dest;         //将目的操作数保存起来

while (*dest)             //首先将目的操作数指向‘\0’处

{

dest++;

}

while (k)                  //再将源操作数追加上去

{

*dest++ = *src++;

k--;

}

return tmp;

}

这里要说的是,在你执行这个函数是,要将你的目的操作数保存起来,因为当你执行完整个函数时,你的目的操作数的指针已经指向的不是你字符串的首地址了,而当你要返回时必须返回的是你目的操作数的首地址,因此应提前保存起来。

最后一个就是strstr函数,其主要目的是找子串,它的主要函数方法是两层循环嵌套,第一层循环是以目的操作数作为循环条件的,它主要是为了找到它与源操作数相等时的起始位置,当找到时再进入源操作数的循环,判断整个源操作数是否为它的子串。

主要函数代码如下:

void *my_strstr(char *dest, const char *src)

{

assert(dest);

assert(src);

char *tmp = NULL;

while (*dest)

{

while (*src)

{

if (*dest == *src)

{

dest++;

src++;

}

else break;

}

if (*src == 0)

{

return tmp;      //返回的是找到时目的操作数的位置

}

else

{

dest++;

tmp = dest;       //找到其相等时的位置

}

}

}

这里注意的还是返回值的问题,它返回的是你目的操作数与源操作数相等时的地址,因此要用指针对其进行标识。

时间: 2024-09-30 06:51:33

strlen strncat strstr 三种库函数的代码实现的相关文章

大钟的ios开发之旅(4)————简单谈谈ios程序界面实现的三种方式(代码创建,xib和storyboard)

/******************************************************************************************** * author:[email protected]大钟 * E-mail:[email protected] *site:http://www.idealpwr.com/ *深圳市动力思维科技发展有限公司 * http://blog.csdn.net/conowen * 注:本文为原创,仅作为学习交流使用,转

三种弹窗提醒代码范例

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

dom4j解析xml的三种方式java代码

虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 <?xml version="1.0" encoding="UTF-8"?>

JavaScript中交换两个变量的值得三种做法(代码实现)

javascript在编程时经常会涉及到如何交换两个变量的值,例如常见的冒泡排序,快速排序等:下面我讲根据自己近期所学总结几种常见的交换两个变量值的方法: 方法一:借助第三方变量交换两个变量的值 var num1=20; var num2=50; var temp=num1; num1=num2; num2=temp; console.log(num1);//在控制台输出交换后的num1=50 console.log(num2);//在控制台输出交换后的num2=20 方法二:借助加法计算,交换

rabbitmq direct/fanout/topic 三种Exchange java 代码比较

Producer端 1.channel的创建 无论是才用什么样的Exchange,创建channel代码都是相同的,如下 1 ConnectionFactory factory = new ConnectionFactory(); 2 factory.setHost("localhost"); 3 Connection connection = factory.newConnection(); 4 Channel channel = connection.createChannel()

二叉树的实现以及三种遍历方法--代码

1 #include<stdio.h> 2 #include <stdlib.h> 3 4 /*树的数据类型*/ 5 typedef char TElemType; 6 /*定义二叉树的结构*/ 7 typedef struct BiTNode 8 { 9 TElemType data; //数据 10 struct BiTNode *left,*right; //左右孩子节点 11 }BiTNode,*BiTree; 12 13 void createBiTree(BiTree*

Emu8086三种格式的代码-(顺序,分支,循环)

这个学期准备考研,于是就没有怎么听别的课,现在临近期末,汇编成了个难题.下面是我学校的实验报告 做一个复习的记录吧,下面的代码都是在Emu8086上运行出来的代码 下面先介绍一下,汇编里面的格式问题 简化段格式定义.MODEL SMALL ;定义程序的存储模式 .MODEL SMALL ;定义程序的存储模式 .STACK ;定义堆栈段 .DATA ;定义数据段 ....... ;数据定义 .CODE ;定义代码段 .STARTUP ;程序起始点,并建立DS,SS内容 ....... ;程序定义

常用的三种设计模式 PHP代码

// 工厂模式 interface Iuser { public function getUserName(); } class UserFactory { static public function load($className) { return new strtolower($className); } static public function create($className) { return new strtolower($className); } } class Use

JAVA之线程同步的三种方法

最近接触到一个图片加载的项目,其中有声明到的线程池等资源需要在系统中线程共享,所以就去研究了一下线程同步的知识,总结了三种常用的线程同步的方法,特来与大家分享一下.这三种方法分别是:synchronized代码段.synchronized修饰方法/类.ThreadLocal本地线程变量. 我们通过一个例子来表现这三种方法:一张银行卡里面有300块钱,15个线程从这张银行卡中取钱,每个线程取一次且每次取20块钱:当当前余额不足100元时,则向账户中汇款20元.三种方法每种方法都有5个线程.我们预期