| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1682 人关注过本帖
标题:字符串替换函数定义方式比较
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
已结贴  问题点数:10 回复次数:17 
字符串替换函数定义方式比较
程序代码:
方式一:
// 把字符串str中的子字符串substr1用子字符串substr2替换
char* SwapSubstr(char *dest, char *source, char*substr1, char*substr2)
{
    char *pstr = source;
    char *pstr1 = dest;
    unsigned int i;
  
    for (i=0;i<strlen(source)-strlen(substr1)+1;i++)
    {
        if (0==strncmp(pstr,substr1,strlen(substr1)))
        {
            strcat(pstr1,substr2);
            pstr += strlen(substr1);
            pstr1 += strlen(substr2);
        }
        else
            *pstr1++ = *pstr++;
    }
    *pstr1 = 0;
    return dest;
}
上述函数要求替换产生的目的存储器事先传入
程序代码:
// 方式二:
char* SwapSubstr(char *source, char*substr1, char*substr2)
{
    static char dest[1024];
    char *pstr = source;
    char *pstr1 = dest;
    unsigned int i;
  
    for (i=0;i<strlen(source)-strlen(substr1)+1;i++)
    {
        if (0==strncmp(pstr,substr1,strlen(substr1)))
        {
            strcat(pstr1,substr2);
            pstr += strlen(substr1);
            pstr1 += strlen(substr2);
        }
        else
            *pstr1++ = *pstr++;
    }
    *pstr1 = 0;
    return dest;
}
方式二则使用静态存储器的方式,不用预先制定目标存储器,但是这种方式的不利之处在于不可多线程并行处理
搜索更多相关主题的帖子: 函数 串替 定义 字符 
2010-07-02 21:44
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:3 
学习,

不过你写的这一句, 不觉得别扭吗?
if (0==strncmp(pstr,substr1,strlen(substr1)))

如果我去写, 我肯定写成这样的
if (!strncmp(pstr,substr1,strlen(substr1)))
退其次, 我会直接写成这样的 if (strncmp(pstr,substr1,strlen(substr1)) == 0)

这一句不是太雅,
for (i=0;i<strlen(source)-strlen(substr1)+1;i++)

换成是我, 会写成这样的
srcLen = strlen(source);
subLen = strlen(substr1);
for (i=0;i<srcLen - subLen+1;i++)


[ 本帖最后由 BlueGuy 于 2010-7-3 10:18 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-07-02 21:53
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 2楼 BlueGuy
谢谢您对我的编程规范提出有意的看法

其实我是想说上面两种表示方法,那种比较好呢?我现在有点犹豫

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-07-02 22:16
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 3楼 vfdff
我以为您在发表原创文章呢!

我就是真命天子,顺我者生,逆我者死!
2010-07-02 22:17
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
我推荐第一种写法,因为 free 掉比较方便,节省内存。
之于什么并行的,我不太了解了。

[ 本帖最后由 BlueGuy 于 2010-7-2 22:29 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-07-02 22:27
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:3 
这是楼主写的代码:
for (i=0;i<strlen(source)-strlen(substr1)+1;i++)
这是二楼写的代码:
srcLen = strlen(source);
subLen = strlen(substr1);
for (i=0;i<srcLen - subLen;i++)

在这里本人想说一句,我赞成二楼写的,因为什么呢?楼主写的代码在每次循环的时候都会去运算字符串的长度,浪费时间
,而二楼写的代码在效率上会比楼主的代码要高!!!!


这是楼主写的代码:
if (0 == strncmp(pstr,substr1,strlen(substr1)))
这是二楼写的代码:
if (strncmp(pstr,substr1,strlen(substr1)) == 0)

个人比较喜欢写成楼主这样的!!所以比较赞成楼主的!!


[ 本帖最后由 我菜119 于 2010-7-3 00:56 编辑 ]

愿用余生致力编程
2010-07-02 23:24
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
二楼中的 for (i=0;i<srcLen - subLen;i++)是有效率

不过要改成for (i=0; i<srcLen - subLen + 1; i++)

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-07-02 23:55
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:3 
谈不上效率问题。
如果稍微想提高一点点点点点点的效率,就用do-while结构。
strlen(source)-strlen(substr1)+1这种写法很规范。
长度计算也只是一次而已。
第一种写法好一些。看取舍了。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-07-03 01:40
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
回复 8楼 你们都要疼我哦
如果字符串太长了,你就会发现二楼写的那个效率高!!!!!

愿用余生致力编程
2010-07-03 10:38
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
哎 效率不是靠想象的,你认为每循环一次,就都要去计算strlen(),这只是你的想当然。

实际上仅在进入时计算一次,然后strlen(source)-strlen(substr1)+1就以固定值出现了。
无端又引入srcLen subLen 这两个局部变量。。。其实其值相对来讲是常量,运行时还要分配栈空间,效率反而低。
也许你想的多一些,认为循环条件并非常量,认为他们是作为参数传入,在编译阶段无法确定,值并不固定,所以每次都要计算。 但实际进到函数内部 对于FOR来说,仅需计算一次,就是固定值。再长,也不会进行第2次计算。
可能比较不容易理解, 慢慢学多了就好了。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-07-03 14:10
快速回复:字符串替换函数定义方式比较
数据加载中...
 
   



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

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