| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2637 人关注过本帖
标题:关于实现标准库函数strncpy遇到的问题
只看楼主 加入收藏
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
 问题点数:0 回复次数: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-02-11 10:15
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
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-02-11 10:52
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
以下是引用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-02-11 15:51
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
恩,两位大大都说得很有道理,我已经差不多弄明白来,谢谢。

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

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

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-02-11 17:30
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
#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-02-11 18:27
快速回复:关于实现标准库函数strncpy遇到的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041907 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved