strcpy函数写法
来源:互联网 发布:Oracle 序列的值sql 编辑:程序博客网 时间:2024/05/29 14:47
很多公司用这个函数考察应聘者的一些技能,如代码风格、代码成熟度等。
首先要避免国内一些教科书的误导的诸如while(*dest++=*src++)这样的代码。
我把参考写法如下(纯C代码):
000
001# include
002
003# define BOUNDS_VIOLATED (__builtin_trap (), 0)
004
005# define CHECK_BOUNDS_LOW(ARG)\
006(((__ptrvalue (ARG) < __ptrlow (ARG)) && BOUNDS_VIOLATED),\
007__ptrvalue (ARG))
008
009# define CHECK_BOUNDS_HIGH(ARG)\
010(((__ptrvalue (ARG) > __ptrhigh (ARG)) && BOUNDS_VIOLATED),\
011__ptrvalue (ARG))
012
013/* copy src to dest */
014char *
015strcpy ( char *dest, const char *src)
016{
017register char c;
018char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src);
019const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1;
020size_t n;
021do {
022c = *s++;
023s[off] = c;
024} while (c != '\0');
025n = s - src;
026(void) CHECK_BOUNDS_HIGH (src + n);
027(void) CHECK_BOUNDS_HIGH (dest + n);
028return dest;
029}
030
要注意的有:
1、第003行宏调用的函数为指针越界陷阱系统调用(bounds check,即int $5);
2、第006行的‘&&’和‘,’符号在宏中的用法;
3、数据类型的定义,诸如ptrdiff_t, size_t等的使用;
4、第023的s指针为什么高效,如寄存器使用数量是最少的;
5、第026行为什么要返回void类型;
首先要避免国内一些教科书的误导的诸如while(*dest++=*src++)这样的代码。
我把参考写法如下(纯C代码):
000
001# include
002
003# define BOUNDS_VIOLATED (__builtin_trap (), 0)
004
005# define CHECK_BOUNDS_LOW(ARG)\
006(((__ptrvalue (ARG) < __ptrlow (ARG)) && BOUNDS_VIOLATED),\
007__ptrvalue (ARG))
008
009# define CHECK_BOUNDS_HIGH(ARG)\
010(((__ptrvalue (ARG) > __ptrhigh (ARG)) && BOUNDS_VIOLATED),\
011__ptrvalue (ARG))
012
013/* copy src to dest */
014char *
015strcpy ( char *dest, const char *src)
016{
017register char c;
018char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src);
019const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1;
020size_t n;
021do {
022c = *s++;
023s[off] = c;
024} while (c != '\0');
025n = s - src;
026(void) CHECK_BOUNDS_HIGH (src + n);
027(void) CHECK_BOUNDS_HIGH (dest + n);
028return dest;
029}
030
要注意的有:
1、第003行宏调用的函数为指针越界陷阱系统调用(bounds check,即int $5);
2、第006行的‘&&’和‘,’符号在宏中的用法;
3、数据类型的定义,诸如ptrdiff_t, size_t等的使用;
4、第023的s指针为什么高效,如寄存器使用数量是最少的;
5、第026行为什么要返回void类型;
0 0
- strcpy函数写法
- strcpy函数写法
- strcpy函数写法
- 字符串拷贝函数strcpy写法
- 一种strcpy原始函数写法
- C strcpy()和strstr()函数的写法
- c函数:出现频率最高的笔试题strcpy写法
- 不使用库函数实现字符串拷贝函数strcpy写法
- strcat,strcpy,strcmp,strlen函数原型及其写法
- 教教大家一些strcpy,strcmp,strcat,strlen函数的写法
- strcpy 严格写法
- 笔试题strcpy写法
- 笔试题strcpy写法
- 笔试题strcpy写法
- strcpy函数
- strcpy函数
- strcpy函数
- strcpy()函数
- hdu 1251 (字典树 Trie 模板题)
- MFC单文档下为视图类添加按钮及其响应事件
- Oracle创建表空间、创建用户以及授权、查看权限
- 虚继承内存布局@c++对象模型
- USB数据线内阻对充电电流的影响
- strcpy函数写法
- 嵌入式系统设计师——第一天学习
- 命令行安装MySQL出现 Install/Remove of the Service Denied!
- 什么是JNI
- 消费者-生产者问题---进程的实现信号量
- ssh
- [九度1512 剑指offer7] 用两个栈实现队列
- Android + kernel USB host 如何判断插入的设备是高速还是低速的设备
- 如何修改WordPress安装路径