| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 581 人关注过本帖
标题:关于实现标准库函数strncpy遇到的问题
收藏  订阅  推荐  打印 
yuki
Rank: 4
等级:高级会员
威望:5
帖子:507
积分:6326
注册:2005-2-4
关于实现标准库函数strncpy遇到的问题

大家帮我看看以下代码。。。。。为什么我定义char *s = NULL被函数调用时会有问题?然而如果我在strncpy函数实现中使用内存分配的话,对于char *s也无法正常返回结果。。。请问这究竟是为什么。。。。。。。谢谢。。。。 #include <iostream>

using namespace std;

int usr_strlen(const char *s); char *usr_strncpy(char *des,const char *src,int size);

int main() { char s[5]; /* Error: char *s = NULL */ cout << usr_strncpy(s,"Hello,World!",5) << endl;

return 0; }

int usr_strlen(const char *s) { int result = 0; while(*s++ != '\0') result++;

return result; }

char *usr_strncpy(char *des,const char *src,int size) { int i; char *p = des; if(src == NULL) { return NULL; des = NULL; }

for(i = 0; i < (usr_strlen(src) < size ? usr_strlen(src) : size); i++) { *des = *src; des++; src++; } *des = '\0'; return p; }

搜索更多相关主题的帖子: strncpy  函数  
2005-2-11 10:15
kai
Rank: 12Rank: 12Rank: 12
等级:版主
威望:34
帖子:3088
积分:31938
注册:2004-4-25

yuki, 看到你这个帖子,很想马上答复你,但是一种不舒服的感觉充斥着我。我又不想答复你了。 我想你是一个初学者,有很长的路要走。相信你在1年后,一定会明白,为什么,我看到你这个帖子后会有一种不舒服的感觉。 指针是你比较模糊的概念,我想告诉你的是,指针表示的是地址的概念。数据不会漂浮在空气中,它客观的存在于你的机器中,存在于你的硬盘上,存在于你的存储器中(ram), 那么如果我们知道了他们的地址,那么我们便可访问他们,操作他们。 申明一个指针变量为零,表示这个指针变量为空指针,也就是说这个指针变量没有赋予任何地址值,它与任何一个都无关系。 当你需要利用它时,你必须告诉它,他应该指向哪个地址, 比如: char test = 'A'; char *p_c = &test; // 我们将test 这个变量所处的地址赋予指针变量 p_c, 再比如,你那个例子中,其实那条语句没有错误,只是你后面没有写完整而以,如何改正,请看下面: char * s = NULL // it is ok, no error s = new char[20]; // now s points to an address, which new created, // and you can save 20 char elements under this address strncpy(s, "Hello world!", 5); // now you can use it without problem delete [] s; // causion, you must delete the space, which with new created.

自由,民主,平等,博爱,进步.
2005-2-11 10:52
Knocker
Rank: 12Rank: 12Rank: 12
等级:贵宾
威望:36
帖子:9963
积分:324662
注册:2004-6-1

以下是引用yuki在2005-2-11 10:15:55的发言:

大家帮我看看以下代码。。。。。为什么我定义char *s = NULL被函数调用时会有问题?然而如果我在strncpy函数实现中使用内存分配的话,对于char *s也无法正常返回结果。。。请问这究竟是为什么。。。。。。。谢谢。。。。 #include <iostream>

using namespace std;

int usr_strlen(const char *s); char *usr_strncpy(char *des,const char *src,int size);

int main() { char s[5]; /* Error: char *s = NULL */ cout << usr_strncpy(s,"Hello,World!",5) << endl;

return 0; }

int usr_strlen(const char *s) { int result = 0; while(*s++ != '\0') result++;

return result; }

char *usr_strncpy(char *des,const char *src,int size) { int i; char *p = des; if(src == NULL) { return NULL;//Kai说到的问题我就不重复了,说说你其它的问题 des = NULL;//这是个“废”语句,永远也不会被执行 }

for(i = 0; i < (usr_strlen(src) < size ? usr_strlen(src) : size); i++)//这里的 i < (usr_strlen(src) < size ? usr_strlen(src) : size); 虽然现在的机器性能很好,也没有必要这样浪费系统资源,for每被执行一次usr_strlen(src) 将“额外”被执行一或两次 *des = *src; des++; src++; } *des = '\0'; return p; }


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-2-11 15:51
yuki
Rank: 4
等级:高级会员
威望:5
帖子:507
积分:6326
注册:2005-2-4

恩,两位大大都说得很有道理,我已经差不多弄明白来,谢谢。

首先我已经将knocker大大说得des=NULL语句提到了return NULL;上面去,让后单独声明了一个变量int limited = usr_strlen(src) &lt; size ? usr_strlen(src) : size;这样再循环语句中i &lt; limited,这样就不会重复计算了。

然后kai大大说得用new语句来给字指针初始化,有个问题我还不太明白,为什么在那个strncpy函数中对des指针同样初始化却无法返回正确的结果?

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-2-11 17:30
kai
Rank: 12Rank: 12Rank: 12
等级:版主
威望:34
帖子:3088
积分:31938
注册:2004-4-25

#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
using namespace std;

int usr_strlen(const char * s);
char * usr_strncpy(char * des, const char * src, int size);

int main()
{
    //char s[5];
    char * s = NULL;
    int SIZE = 5;
    s = new char[SIZE+1];  // plus 1, because you need '\0' to end your string
    cout &lt;&lt; usr_strncpy(s, "Hello,World!", SIZE) &lt;&lt; endl;
    delete [] s;
    s = NULL;   // to avoide wild pointer
    system("pause");  
    return 0;
}

int usr_strlen(const char * s)
{
    int result = 0;
    while(*s++ != '\0')
        result++;
    return result;
}

char * usr_strncpy(char * des,const char * src,int size)
{
    int i;
    char * p = des;
    if(src == NULL)
    {
        return NULL;
        // des = NULL; // The logic is wrong! We should not change the destination address
    }
    int length = (usr_strlen(src) &lt; size ? usr_strlen(src) : size);
    for(i = 0; i &lt;length;  i++)
    {
        *des = *src;
        des++;
        src++;
    }
    *des = '\0';
    return p;
}

自由,民主,平等,博爱,进步.
2005-2-11 18:27
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.055883 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved