C语言str系列库函数在不同的库中有不同的实现方法,但原理都是一样的。因为库函数都是没有进行入口参数检查的,并且str系列库函数在面试中经常容易被面试官喊在纸上写某一个函数的实现,因此本文参考了OpenBSD和vc++ 8.0库中的代码,结合自己的编程习惯,部分整理如下:

1、strcpy

[cpp]  view plain copy
  1. char * strcpy(char *dst, const char *src)
  2. {
  3. char *d;
  4. if (dst == NULL || src == NULL)
  5. return dst;
  6. d = dst;
  7. while (*d++ = *src++)    // while ((*d++ = *src++) != '\0')
  8. ;
  9. return dst;
  10. }

2、strncpy

[cpp]  view plain copy
  1. //copy at most n characters of src to dst
  2. //Pad with '\0' if src fewer than n characters
  3. char *strncpy(char *dst, const char*src, size_t n)
  4. {
  5. char *d;
  6. if (dst == NULL || src == NULL)
  7. return dst;
  8. d = dst;
  9. while (n != 0 && (*d++ = *src++))    /* copy string */
  10. n--;
  11. if (n != 0)
  12. while (--n != 0)
  13. *d++ == '\0';                /* pad out with zeroes */
  14. return dst;
  15. }

注意 n是unsigned int,在进行n--操作时特别要小心。如果不小心写成下面这样就会出错:

[cpp]  view plain copy
  1. while (n-- != 0 && (*d++ = *src++))
  2. ;
  3. while (n-- != 0)
  4. *d++ = '\0';

第一个while循环中,当n变为0时,仍然会执行n--一,此时n等于经由-1变成的大正数,导致后面对n的使用出错。

3、strcat

[cpp]  view plain copy
  1. char *strcat(char *dst, const char *src)
  2. {
  3. char *d;
  4. if (dst == NULL || src == NULL)
  5. return dst;
  6. d = dst;
  7. while (*d)
  8. d++;
  9. //while (*d++ != 0);
  10. //d--;
  11. while (*d++ = *src++)
  12. ;
  13. return dst;
  14. }

4、strncat

写法1:
[cpp]  view plain copy
  1. //concatenate at most n characters of src to the end of dst
  2. //terminates dst with '\0'
  3. char *strncat(char *dst, const char *src, size_t n)
  4. {
  5. if (NULL == dst || NULL == src)
  6. return dst;
  7. if (n != 0)
  8. {
  9. char *d = dst;
  10. do
  11. {
  12. if ((*d = *src++) == '\0' )
  13. return dst;     //break
  14. d++;
  15. } while (--n != 0);
  16. *d = '\0';
  17. }
  18. return dst;
  19. }

写法2:

[cpp]  view plain copy
  1. char *strncat(char *dst, const char *src, size_t n)
  2. {
  3. char *d;
  4. if (dst == NULL || src == NULL)
  5. return dst;
  6. d = dst;
  7. while (*d)
  8. d++;
  9. //(1)
  10. while (n != 0)
  11. {
  12. if ((*d++ = *src++) == '\0')
  13. return dst;
  14. n--;
  15. }
  16. //(2)
  17. //while (n--)       //这种方式写最后n的值不为0,不过这个n后面不会再被使用
  18. // if ((*d++ == *src++) == '\0')
  19. //  return dst;
  20. *d = '\0';
  21. return dst;
  22. }

5、strcmp

[cpp]  view plain copy
  1. int strcmp(const char *s1, const char *s2)
  2. {
  3. if (s1 == NULL || s2 == NULL)
  4. return 0;
  5. //(1)
  6. //while (*s1 == *s2++)
  7. //  if (*s1++ == '\0')
  8. //      return 0;
  9. //(2)
  10. for (; *s1 == *s2; s1++, s2++)
  11. if (*s1 == '\0')
  12. return 0;
  13. return *(unsigned char*)s1 - *(unsigned char*)s2;
  14. }

6、strncmp

[cpp]  view plain copy
  1. int strncmp(const char *s1, const char *s2, size_t n)
  2. {
  3. if (s1 == NULL || s2 == NULL)
  4. return 0;
  5. if (n == 0)
  6. return 0;
  7. do
  8. {
  9. if (*s1 != *s2++)
  10. return *(unsigned char*)s1 - *(unsigned char*)--s2;
  11. if (*s1++ == '\0')
  12. break;
  13. } while (--n != 0);
  14. //do
  15. //{
  16. //  if (*s1 != *s2)
  17. //      return *(unsigned char*)s1 - *(unsigned char*)s2;
  18. //  if (*s1 == '\0')
  19. //      break;
  20. //  s1++;
  21. //  s2++;
  22. //} while (--n != 0);
  23. return 0;
  24. }

7、strstr

写法1:
[cpp]  view plain copy
  1. //return pointer to first  occurrence of find in s
  2. //or NULL if not present
  3. char *strstr(const char *s, const char *find)
  4. {
  5. char *cp = (char*)s;
  6. char *s1, *s2;
  7. if (s == NULL || find == NULL)
  8. return NULL;
  9. while (*cp != '\0')
  10. {
  11. s1 = cp;
  12. s2 = (char*)find;
  13. while (*s1 && *s2 && *s1 == *s2)
  14. s1++, s2++;
  15. if(*s2 == '\0')
  16. return cp;
  17. cp++;
  18. }
  19. return NULL;
  20. }
写法2:参照简单模式匹配算法
[cpp]  view plain copy
  1. char *strstr(const char *s, const char *find)
  2. {
  3. int i = 0, j = 0;
  4. while (*(s + i) != '\0' && *(find + j) != '\0')
  5. {
  6. if (*(s + i + j) == *(find + j))
  7. j++;     //继续比较后一字符
  8. else
  9. {
  10. i++;     //开始新一轮比较
  11. j = 0;
  12. }
  13. }
  14. return *(find + j) == '\0' ? (char*)(s + i) : NULL;
  15. }

8、strchr

[cpp]  view plain copy
  1. //return pointer to first occurrence of ch in str
  2. //NULL if not present
  3. char *strchr(const char*str, int ch)
  4. {
  5. while (*str != '\0' && *str != (char)ch)
  6. str++;
  7. if(*str == (char)ch)
  8. return (char*)str;
  9. return NULL;
  10. }

9、strrchr

[cpp]  view plain copy
  1. //return pointer to last occurrence of ch in str
  2. //NULL if not present
  3. char *strrchr(const char *str, int ch)
  4. {
  5. if (str == NULL)
  6. return NULL;
  7. char *s = (char*)str;
  8. while (*s++)
  9. ;       /* find end of string */
  10. while (--s != str && *s != (char)ch)
  11. ;       /* search towards front */
  12. if(*s == (char)ch)
  13. return (char*)s;
  14. return NULL;
  15. }

10、strlen

[cpp]  view plain copy
  1. size_t strlen(const char *str)
  2. {
  3. if (str == NULL)
  4. return 0;
  5. const char *eos = str;
  6. while (*eos++)
  7. ;
  8. return (eos - 1 - str);
  9. }

另外两篇str系列库函数:
C语言str系列库函数之strtok(): http://blog.csdn.net/u013071074/article/details/27716097

C语言str系列库函数之strspn()、strcspn()和strpbrk(): http://blog.csdn.net/u013071074/article/details/27808497
str系列库函数的使用实例: http://www.cplusplus.com/reference/cstring/

c语言str相关的函数相关推荐

  1. C语言 system相关的函数

    system相关的函数 clrscr,ClearScreen DispBCD SetScrollBar TextOut,outtextxy TextOut bell block cursor dela ...

  2. C语言 字符串相关的函数

    字符串相关的函数 bcmp bcopy bzero memccpy memchr memcmp memcpy memicmp memmove memset movmem setmem stpcpy s ...

  3. C语言的math相关的函数

    C语言的math相关的函数 fabs abs acos asin atan atan2 ceil cos cosh exp fabs floor fmod hypot ldexp log log10 ...

  4. c语言time头文件作用,C语言中 time相关的函数 头文件

    1.  time相关的函数在 time.h 中可以查看原型.如下命令可以找出time.h的路径: whereis time.h 2. 先看代码,要包含time.h ================== ...

  5. puts和fputs函数及其区别,C语言puts和fputs函数详解

    puts和fputs函数及其区别,C语言puts和fputs函数详解 与 gets 函数一样,对于 puts 函数,同样建议使用 fputs 函数来代替 puts 函数.如下面的示例代码所示: int ...

  6. Swift 1.1语言第7章 函数和闭包

    Swift 1.1语言第7章  函数和闭包 在编程中,随着处理问题的越来越复杂,代码量飞速增加.其中,大量的代码往往相互重复或者近似重复.如果不采有效方式加以解决,代码将很难维护.为了解决这个问题,人 ...

  7. c语言高函数正确形式,计算机二级C语言考点解析:函数

    小编所收集到的相关计算机二级C语言考点解析:函数的资料 大家要认真阅读哦! 一.库函数的正确调用 1.C语言提供了丰富的库函数,包括常用数学函数.对字符和字符串处理函数.输入输出处理函数等.在调用库函 ...

  8. C语言常用字符串操作函数大全详解(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等)

    参考:string.h中常用字符串操作函数说明(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等) 作者:一只青木呀 ...

  9. C语言试题六十二之请编写函数fun除了字符串前导和尾部的*号之外,将串中其他*号全部删除。形参h已指向字符串第一个字母,形参p已指向字符串中最后一个字母。在编写程序时,不得使用c语言提供的字符串函数。

    1. 题目 请编写函数fun除了字符串前导和尾部的*号之外,将串中其他*号全部删除.形参h已指向字符串第一个字母,形参p已指向字符串中最后一个字母.在编写程序时,不得使用c语言提供的字符串函数. 比如 ...

最新文章

  1. WinDbg安装与使用
  2. 让机器“看见”:图像数据的特征提取方法
  3. android学习之-简单对话框
  4. Delphi常见各类编译错误信息-中英对照
  5. Google Chrome input 设置 line-height 后光标变得和input一样高
  6. cmake 找不到 macros_愿我们在彼此看不到的岁月里熠熠生辉
  7. 认识HTML与CSS
  8. tensorflow Keras的搭建训练步骤
  9. 用Python+小程序实现诗词大会的飞花令
  10. 6月30日 区块链新闻
  11. firefox不能正常下载文件
  12. CDH5(CDH 5.16.1)安装
  13. Linux内核编译基础
  14. 多wan口路由器,如何实现域名解析?
  15. js实现小球抛物线运动
  16. eai java实现,月光软件站 - 编程文档 - Java - 建立EAI方式与SAI方式之间的通信
  17. 2.6 Python 基本数据类型
  18. 【观察】纯公有云+全场景SaaS服务,用友YonSuite领跑背后的“制胜秘诀”
  19. 北京自贸区总体方案公布:建设法定数字货币试验区
  20. 10-207 在订单表中查询运费在40元到60元之间的订单的全部信息

热门文章

  1. 用outook发邮件能撤回吗?邮件怎么撤回技巧
  2. 电机专用MCU芯片LCM32F037系列内容介绍
  3. Linux 查看最耗费资源的几个进程
  4. Mybatis学习【2】
  5. Golang DNS 随便写写
  6. Model Inversion Attacks that Exploit Confidence Informati on and Basic Countermeasures 阅读心得
  7. 制作一个简单HTML红色喜庆邀请函网页(HTML+CSS)
  8. 复旦情商课魅力女教师上课实录
  9. cp7s2装Linux,基礎級拆機-神舟戰神GX8CP5s1上8700發現較為雞肋-仿CP7s2
  10. 如何组织一场安全、可靠、高效的网络实战攻防演习?