C语言基础字符串函数源代码

#include

#include

/*

* 作用:获取串str的长度

*/

int strlen(const char *pcStr)

{

assert(pcStr != NULL);

int iLen = 0;

while ('\0' != *pcStr)

{

pcStr++;

iLen++;

}

return iLen;

}

/*

* 前提:strDes指向的内存至少能够容纳(strlen(strDes) + strlen(strSrc) + 1) bytes

* 作用:将串strSrc连接到串strDes的末尾,函数本身不保证安全(使用不当会内存溢出)

*/

char *strcat(char *pcStrDest, const char *pcStrSrc)

{

assert((pcStrDest != NULL) && (pcStrSrc != NULL));

char *pcTemp = pcStrDest;

/* pcStrDes指针指向串pcStrDes的末尾 */

while ('\0' != *pcStrDest)

{

pcStrDest++;

}

/* 依次从源串pcStrSrc不断拷贝字符到目的串pcStrDes中 */

while ('\0' != *pcStrSrc)

{

*pcStrDest = *pcStrSrc;

pcStrSrc++;

pcStrDest++;

}

*pcStrDest = *pcStrSrc;

return pcTemp;

}

/*

* 前提:strDes指向的内存至少能够容纳(strlen(strSrc) + 1) bytes

* 作用:将串strSrc拷贝到strDes指向的内存空间,函数本身不保证安全(使用不当会内存溢出)

*/

char *strcpy(char *pcStrDest, const char *pcStrSrc)

{

assert((pcStrDest != NULL) && (pcStrSrc != NULL));

char *pcTemp = pcStrDest;

while ('\0' != *pcStrSrc)

{

*pcStrDest = *pcStrSrc;

pcStrSrc++;

pcStrDest++;

}

*pcStrDest = *pcStrSrc;

return pcTemp;

}

/*

* 作用:按字典序比较串s和串t的大小

*/

int strcmp(const char *pcStrA, const char *pcStrB)

{

assert((pcStrA != NULL) && (pcStrB != NULL));

while (('\0' != *pcStrA) && ('\0' != *pcStrB) && (*pcStrA == *pcStrB))

{

pcStrA++;

pcStrB++;

}

return (int)(*pcStrA - *pcStrB);

}

/*

* 前提:strDes指向的内存至少能够容纳(strlen(strDes) + count + 1) bytes

* 作用:将串strSrc的前count个字符连接到串strDes的末尾,函数本身不保证安全(使用不当会内存溢出)

*/

char *strncat(char *pcStrDest, const char *pcStrSrc, int iCount)

{

assert((pcStrDest != NULL) && (pcStrSrc != NULL));

char *pcTemp = pcStrDest;

while ('\0' != *pcStrDest)

{

pcStrDest++;

}

while ((iCount > 0) && ('\0' != *pcStrSrc))

{

*pcStrDest = *pcStrSrc;

pcStrSrc++;

pcStrDest++;

iCount--;

}

*pcStrDest = '\0';

return pcTemp;

}

/*

* 前提:strDes指向的内存至少能够容纳(count + 1) bytes

* 作用:将串strSrc的前count个字符拷贝到strDes指向的内存空间,函数本身不保证安全(使用不当会内存溢出)

*/

char *strncpy(char *pcStrDest, const char *pcStrSrc, int iCount)

{

assert((pcStrDest != NULL) && (pcStrSrc != NULL));

char *pcTemp = pcStrDest;

while ((iCount > 0) && ('\0' != pcStrSrc))

{

*pcStrDest = *pcStrSrc;

pcStrSrc++;

pcStrDest++;

iCount--;

}

return pcTemp;

}

/*

* 作用:按字典序比较串s和串t的前count个字符的大小

*/

int strncmp(const char *pcStrA, const char *pcStrB, int iCount)

{

assert((pcStrA != NULL) && (pcStrB != NULL));

while (('\0' != *pcStrA) && ('\0' != *pcStrB) && (*pcStrA == *pcStrB) &&

(iCount > 0))

{

iCount--;

if (0 == iCount)

{

break;

}

pcStrA++;

pcStrB++;

}

return (int)(*pcStrA - *pcStrB);

}

/*

* 前提:dest指向的内存能够容纳count bytes

* 作用:将src所指向内存的count bytes拷贝到的dest指向的内存

*/

void *memcpy(void *pvDest, const void *pvSrc, int iCount)

{

assert((pvDest != NULL) && (pvSrc != NULL));

void *pvTemp = pvDest;

char *pcDest = (char *)pvDest;

const char *pcSrc = (const char *)pvSrc;

while (iCount > 0)

{

*pcDest = *pcSrc;

pcDest++;

pcSrc++;

iCount--;

}

return pvTemp;

}

/*

* 作用:将str的前count个字节置为字符c

*/

void *memset(void *pvSrc, int iCh, int iCount)

{

assert(pvSrc != NULL);

char *pcSrc = (char *)pvSrc;

while (iCount > 0)

{

*pcSrc = (char)iCh;

pcSrc++;

iCount--;

}

return pvSrc;

}

/*

* 作用:将src所指向内存的count bytes拷贝到的dest指向的内存(解决了memcpy未解决的内存重叠问题)

*/

void *memmove(void *pvDest, const void *pvSrc, int iCount)

{

assert((pvDest != NULL) && (pvSrc != NULL));

void *pvTemp = pvDest;

char *pcDest = (char *)pvDest;

const char *pcSrc = (const char *)pvSrc;

// 逻辑:

// 1)在src小于dest前提下,然后判断src+count指向的内存是否与dest指向的内存重叠

// 2) 如果重叠则从src+count开始复制,复制到dest+count,从后往前拷贝count字节

if ((pvSrc < pvDest) && (pvSrc + iCount > pvDest))

{

pcDest = pcDest + iCount - 1;

pcSrc = pcSrc + iCount - 1;

while (iCount > 0)

{

*pcDest = *pcSrc;

pcDest--;

pcSrc--;

iCount--;

}

}

else

{

while (iCount > 0)

{

*pcDest = *pcSrc;

*pcDest++;

*pcSrc++;

iCount--;

}

}

return pvTemp;

}

int main()

{

int iLen = 0;

int iRet = 0;

char acBuffer[4] = {0};

char *pcTestStr1 = "Today is sunday.";

char acTestStr2[] = "Today";

char acTestStr3[] = "Today is sunday.";

char acTestStr4[sizeof("Today is ") + sizeof("sunday.") - 1] = "Today is ";

iLen = strlen(pcTestStr1);

printf("iLen = %d\n", iLen);

(void)strncpy(acBuffer, pcTestStr1, sizeof(acBuffer) - 1);

printf("acBuffer:%s\n", acBuffer);

iRet = strncmp(pcTestStr1, acTestStr2, strlen(acTestStr2));

printf("strncmp iRet = %d\n", iRet);

iRet = strcmp(pcTestStr1, acTestStr2);

printf("strcmp iRet = %d\n", iRet);

(void)memmove(&acTestStr3[1], &acTestStr3[0], strlen("Today"));

printf("memmove acTestStr3:%s\n", acTestStr3);

printf("before strncat acTestStr4:%s\n", acTestStr4);

(void)strncat(acTestStr4, "sunday.111",

sizeof(acTestStr4) - strlen(acTestStr4) - 1);

printf("after strncat acTestStr4:%s\n", acTestStr4);

return 0;

}

©著作权归作者所有:来自51CTO博客作者逆天96的原创作品,如需转载,请注明出处,否则将追究法律责任

c语言字符是源码,C语言基础字符串函数源代码相关推荐

  1. c语言字符动画源码下载,C语言动画程序源码.docx

    C语言动画程序源码 C语言动画程序#include #include #include #include #define pi 3.1415926535 double ca3mm1(double m1 ...

  2. 易语言局域网 php 控制,易语言控制端源码,易语言被控制源码,易语言局域网远程控制源码...

    下面我们对易语言控制端源码,易语言被控制源码,易语言局域网远程控制源码文件阐述相关使用资料和易语言控制端源码,易语言被控制源码,易语言局域网远程控制源码文件的更新信息. 易语言控制端源码,易语言被控制 ...

  3. 易语言html解密源码,易语言 BASE64编码解码源码

    易语言 BASE64编码源码 ------------– .版本 2 .子程序 编码转换_BASE64编码, 文本型, 公开, BASE64编码处理(返回编码后的文本) .参数 待编码数据, 字节集, ...

  4. c语言复制粘贴源码,c语言函数memccpy()如何复制内存中的内容实例源码介绍

    c语言函数memccpy()如何复制内存中的内容实例源码介绍.引入的头文件:#include memccpy()函数定义:void * memccpy(void *dest, const void * ...

  5. C语言端口扫描源码,C语言实现TCP多线程端口扫描

    多线程端口扫描实现(C语言) 源码: #include #include #include #include #include #pragma comment(lib,"WS2_32.lib ...

  6. c语言数独程序源码,c语言编程:优化回溯解数独程序

    上次在博客上发了一篇<C语言:回溯解数独程序>.实在很粗糙,效率相当差.正如在群里一位朋友说的: 你能不能别像傻瓜式一样从左到右从上到下这样搜索呢?如果你这样,我出第一行是空的数独题,那你 ...

  7. c语言传奇引擎源码,Ei3.0服务端引擎源代码+登陆网关+客户端插件

    Ei3.0服务端引擎源代码+登陆网关+客户端插件 procedure TPANEL.Button3Click(Sender: TObject); var P:integer; mItem:DWORD; ...

  8. php易语言互交_易语言php调用源码

    易语言php调用源码系统结构:PHP,SetHandleInformation,CreatePipe,ReadFile,CloseHandle,PeekNamedPipe,GetExitCodePro ...

  9. 易语言 websocket服务器,易语言websocket服务器源码

    易语言websocket服务器源码系统结构:握手包处理,生成握手参数列,创建返回握手包,返回数据包处理,接收数据包解码,高级截取文本,取sha1,切片,ord,字节集到十六进制,十六进制到字节集,取十 ...

  10. c调用易语言串口,易语言串口API源码

    易语言串口API源码系统结构:ReadCommPure,BuildCommDCB,CreateFilea,关闭句柄a,SetCommState,ReadFileA,GetCommState,Write ...

最新文章

  1. HDU 2444 The Accomodation of Students
  2. JSP内置对象-application
  3. 【Git报错】 ! [rejected] master - master (fetch first)
  4. VS条件断点学习总结
  5. CF 46D Parking Lot
  6. 浏览器 制作---TWebBrowser 控件
  7. 织梦php添加函数调用,dedecms自定义函数及实际案例调用
  8. vue路由加载页面时,数据返回慢的问题
  9. git revert reset
  10. ThreadPoolExecutor运转机制详解
  11. 汇川PLC编程软件AutoShop的应用
  12. javaswing个人记账系统 java swing mysql实现的个人记账系统源码(1012)
  13. 一个前端如何画各种特效或图案
  14. Java运行准备JDR JRE JVM知识和环境变量的作用
  15. 帆软折线图设置红色警戒线
  16. aho-corasick php,Aho-Corasick自动机浅析
  17. android 辅助功能(无障碍)
  18. C语言:习题4-5 换硬币 (20分)
  19. 前有天猫生鲜和易果生鲜 系出阿里“同门”的盒马鲜生要怎么走?
  20. spring boot2.X word转pdf

热门文章

  1. ACwing 829 模拟队列
  2. 查看linux用户编码,linux查看服务器编码
  3. android 新手引导轮播,GuideHelper-master
  4. c语言常用数学函数6,C语言入门(6)——C语言常用数学函数
  5. linux7.3系统如何修改系统时间,两招修改​Centos7 系统时区!
  6. 一款严肃而又活泼的少儿学数学软件截图
  7. redis双写一致性问题
  8. Java并发编程之ThreadLocal详解
  9. 高并发编程系列:深入探讨ConcurrentHashMap
  10. 记一次设置密钥登陆centos7所遇问题