只是一个函数的问题strcpy
2015-05-04 16:29
253 查看
char *
strcpy (dest, src)
char *dest;
const char *src;
{
char c;
char *s = (char *) src;
const ptrdiff_t off = dest - s - 1; // 学习了 ptrdiff_t 这个内型,之前还真不知道。就是 一个长 整形,返回一个距离大小。这里不保证指针为空。有意思
do
{
c = *s++;
s[off] = c;
}
while (c != '\0');
return dest;
}
这是glibs代码
下面是 路人甲写的一个代码
// 字符串拷贝函数的实现
char *strcpy(char *dest, const char *src)
{
if ( !dest || !src ) // 应该 检查是否是NULL ,而不是bool 强制转换,有bug
{
return NULL ;
}
if ( dest == src) //有点多余,就像 万里挑一一样,一般不会那么巧
{
return dest ;
}
char *temp = dest ;// 先保存起来。ok 对的
//关键来了
while( (*src) != '/0')
{
*dest = *src;
src++;
dest++;
}
//上面while 有问题吗?
//这里是有错误的,隐藏的很小,很难发觉,这里需要加上 *dest = '\0';不然没法判断到结尾。
dest = temp;
return dest;
}
再看看另一位大侠写的
char *strcpy(char *dest, const char *src)
{
char *p = dest;
while ((*dest++=*src++)!='\0'); // 有问题吗?呵呵 这个跑起来就没问题 因为() 优先级高于 !=,so 他类似去do while 。
return p;
}
但是他也没检查指针,跟glibs 里面一样,这个就要说了,有时候 指针 检查 不一定需要 被调用者来做,调用者 自己也需要去检查。
但这种东西谁说的算?就跟工作一样,他推卸给我,我推卸给别人,有时候都是大家互相体谅。都做好本职工作就好。
由此可见,一个小小函数真是学问多多。
strcpy (dest, src)
char *dest;
const char *src;
{
char c;
char *s = (char *) src;
const ptrdiff_t off = dest - s - 1; // 学习了 ptrdiff_t 这个内型,之前还真不知道。就是 一个长 整形,返回一个距离大小。这里不保证指针为空。有意思
do
{
c = *s++;
s[off] = c;
}
while (c != '\0');
return dest;
}
这是glibs代码
下面是 路人甲写的一个代码
// 字符串拷贝函数的实现
char *strcpy(char *dest, const char *src)
{
if ( !dest || !src ) // 应该 检查是否是NULL ,而不是bool 强制转换,有bug
{
return NULL ;
}
if ( dest == src) //有点多余,就像 万里挑一一样,一般不会那么巧
{
return dest ;
}
char *temp = dest ;// 先保存起来。ok 对的
//关键来了
while( (*src) != '/0')
{
*dest = *src;
src++;
dest++;
}
//上面while 有问题吗?
//这里是有错误的,隐藏的很小,很难发觉,这里需要加上 *dest = '\0';不然没法判断到结尾。
dest = temp;
return dest;
}
再看看另一位大侠写的
char *strcpy(char *dest, const char *src)
{
char *p = dest;
while ((*dest++=*src++)!='\0'); // 有问题吗?呵呵 这个跑起来就没问题 因为() 优先级高于 !=,so 他类似去do while 。
return p;
}
但是他也没检查指针,跟glibs 里面一样,这个就要说了,有时候 指针 检查 不一定需要 被调用者来做,调用者 自己也需要去检查。
但这种东西谁说的算?就跟工作一样,他推卸给我,我推卸给别人,有时候都是大家互相体谅。都做好本职工作就好。
由此可见,一个小小函数真是学问多多。
相关文章推荐
- 一个关于js函数的传值问题
- 同一个C语言工程不同C文件之间的函数互相调用问题(二)
- 学习类,笔记!关于一个函数里面定义多个类以及相互访问的问题
- 问题:求两个字符串的最长公共子串。 要求:输入两个字符串,输出它们的最长公共子串,包括长度。 设计: 设计一个类 String,包括一个 len(字符串长度)和字符串指针 s。另有如下成员函数: ·
- matlab中一个由于文件检索无法和函数并行而引发的问题
- 又是一道随机问题,问题是说:写一个函数返回0,1,2,3这几个数字中的一个数,其中0概率是10%,1是20%,2是30%,3是40%
- strcpy函数用法详细解释和其相关问题
- [转]写一个完美的strcpy / strlen 函数
- strcpy实现及返回值问题(支持链式表达式,增加了函数的附加值)
- 三种实现交换的方法,其中一个诡异的swap函数——C/C++语言(问题求助)
- 一个函数返回临时对象引起的编译器优化问题
- C++中用函数返回值初始类对象时的一个问题
- 两个线程同时调用同一个处理函数的互斥问题
- 处理菱形继承问题&&实现一个虚函数的覆盖及调用&&实现以下几个类的成员函数
- 函数参数用指针或引用传递时发现的一个小问题
- 一个小sql的问题记录 对分析函数的应用
- 关于 Numpy 数组作为函数参数的一个小问题
- 遇到一个关于静态成员函数的问题
- memcpy(szTest, szBuf, sizeof(szTest) - 1);引起的一个超低概率core dump问题的定位------谁说用memcpy能代替strcpy?
- C++对象内存空间变化的问题!只是引入一个析构函数而已!