c语言字符串函数之strcpy,strcat,strncpy,strncat函数解析
来源:互联网 发布:碱性水 知乎 编辑:程序博客网 时间:2024/06/15 11:42
char* strcpy(char *dst, char const * src) { assert((src != NULL) && (dst != NULL)); char *tmp = dst; while ((*dst++ = *src++) != '\0'); return tmp }
上述即为strcpy函数实现。如果参数src和dst在内存中出现重叠,其结果是未定义的。程序员必须保证dst足够长,否则的话,如果src长达大于dst,那么为了把src复制给dst,会侵占dst数组后面的部分内存空间,改写原先恰好存储在那里的变量。例如,看如下代码:
chap dst[5]; char *src = "abcde"; //会在末尾加上NULL字节,所以该字符串长度为6 strcpy(dst, src);
上面,dst长度为5,而src长度为6,肯定会侵占dst后面一个字节的内存,但在语法上是正确的,别想编译器给你报错。这肯定是一个隐藏的bug。
char* strcat(char *dst, char const* src) { char *tmp = src; while (*dst) ++dst; while ((*dst++ = *src++) != '\0'); //该循环结束时,已将将src的NUL字节复制给了dst return tmp }
上述即为strcat函数实现。同strcpy一样,程序员必须保证dst足够长,否则会侵占dst后面的部分内存空间。
char* strncpy(char* dst, char const *src, size_t count) { char * tmp = dst; while (count && (*dst++ = *src++)) //判断src是否到达末尾,且待复制的字节数是否减为0 --count; if (count) //如果count!=0,即src到达末尾,则在末尾添加count个NUL字节,若coun==0,复制完成。返回 while (--count) *dst = '\0' return tmp }
这个函数是不安全的。它调用的结果可能不是一个字符串,因为字符串必须以NUL字节结尾。如果在一个需要字符串的地方使用了一个不是以NUL字节结尾的字符序列,会发生什么呢?这个问题只有当你使用strncpy函数创建字符串,然后或者对它们使用str开头的库函数,或者在printf中使用%s格式码打印它们时才会发生。在使用不收限制的函数之前,你首先必须确保字符串实际上是以NUL字节结尾的,例如,考虑以下代码段:
char buffer[BUFSIZE] ......... strncpy(buffer, name, BUFSIZE) buffer[BUFSZE - 1] = '\0'
char* strncat(char *dst, const char* src, size_t count){if (count){char *tmp = dst;const char *s = src;while (*tmp)//循环结束时,tmp指向了NUL字节。tmp++;do {if ((*tmp = *src++) == 0)//这里src第一个字符覆盖了dst原本的NUL字节break;tmp++;} while (--count);*tmp = 0; //复制完毕后,将最后一个字节置为NUL字节}return dst;}
与strncpy不同的时,在结束时,strncat总是在结果字符串的后面添加一个NUL字节,而且它不会像strncpy那样对目标数组用NUL字节进行填充。
- c语言字符串函数之strcpy,strcat,strncpy,strncat函数解析
- C语言中的几个字符串处理函数: strcat, strncat, strcpy, strncpy, strlen
- 字符串函数模拟实现之strcpy、strncpy、strcmp、strncmp、strcat、strncat
- strcpy、strcat函数源码,strncpy,strncat,strncmp,strtok
- strcpy, strncpy, strcat, strncat, sprintf, snprintf等常用函数
- 自定义实现字符串处理函数 strlen strcmp strcpy strncpy strcat strncat strchr strstr
- 自定义实现字符串处理函数 strlen strcmp strcpy strncpy strcat strncat strchr strstr
- 字符串函数(strcpy strncpy strcat strncat strcmp strncmp memcpy memmove)
- 字符串函数——strcpy 、strncpy 、strcat、 strncat、 strcmp 、strncmp、 memcpy、 memmove)
- C函数:strlen,strcat,strncat,strcmp,strncmp,strcpy,strncpy,strstr详解
- strcpy/strncpy/strcat/strcmp/strlen函数的c语言实现
- c语言之strcat函数Strcpy函数
- C语言的字符串函数strcat()和strncat()
- C语言 strcat()函数和strncat()函数
- 【c语言】模拟实现strcat()、strncat()函数
- [C语言]模拟实现strcpy/strncpy/strcat/strncat/strcmp/strncmp/strstr
- 字符串常用操作(strlen,strcpy,strcat,strcmp,strncpy,strncat)
- 字符串库函数strlen,strcmp,strcpy,strncpy,strcat,strncat自定义实现
- 提高VS2010的运行速度
- 单链表的逆置
- 一道链表的面试题想法
- 注册表文件的编写
- 我的Java开发学习之旅------>心得总结:Java性能优化技巧集锦
- c语言字符串函数之strcpy,strcat,strncpy,strncat函数解析
- 子窗口向父窗口发送消息
- liunx下/opt目录与/usr目录的区别
- hdu 1213 并查集
- Navicat for MySQL 8 注册码
- C语言作业_第二堂
- 核心算法思考
- php基础语法
- ASP.NET 笔记-3