• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 不用string库实现字符串替换

不用string库实现字符串替换

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了string截取字符串,string分割字符串,string包含字符串,string替换字符串,c string截取字符串等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:不用string库实现字符串替换
描述:

当然复杂度越低越好.

strstr的O(m+n)实现也是比较困难.不过已经有解决的办法(kmp)

现在我们想解决一个strrp函数.最低的复杂度应该是O(m+n+k) 吧

最好不用库函数.

好吧,其实我思考了一段时间了. 声明啊:this not my homework.. i do it for good solutions but not for tasks..

难度有点高.大家一起找好算法..

sample input:

src="hello world"   //source string
sub_str="l"   //to be replaced
rpl_with="ab" //replace with

output should be:

"heababo worabd"

解决方案1:

假设已经有一个kmp函数,返回substr在str中出现的位置,如果不存在则返回NULL(行为和strstr一样)。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

const char *kmp(const char *str, const char *substr)
{
    return strstr(str, substr); //kmp的实现略过
}

void str_replace(char *dest, const char *src, 
        const char *pattern, const char *replace)
{
    int lp = strlen(pattern), lr = strlen(replace);
    const char *temp = src, *last = src;
    while ((temp = kmp(temp, pattern)) != NULL)
    {
        //copy to dest
        memcpy(dest, last, temp - last);
        dest += temp - last;

        strcpy(dest, replace);
        dest += lr;

        temp += lp;
        last = temp;
    }
    strcpy(dest, last);
}

int main()
{
    char dest[1000];
    str_replace(dest, "abcdefgabcdefgabcdefg", "fg", "----");
    printf("%s\n", dest);

    str_replace(dest, "abcdefgabcdefgabcdefg", "ef", "----");
    printf("%s\n", dest);

    str_replace(dest, "hello world", "l", "ab");
    printf("%s\n", dest);
    return 0;
}

p.s. 里面虽然用到了 memcpy, strlen, strcpy,但是这些自己额外写都是很简单的。

算法其实挺简单,蛋疼的是接口的设计,得写额外的代码来计算需要多大的空间,上面就略过了,另外附一个由函数负责分配空间的安全版(相应的后果是要额外扫一遍):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

const char *kmp(const char *str, const char *substr)
{
    return strstr(str, substr);
}

char *str_replace(const char *src, const char *pattern, const char *replace)
{
    int count = 0, lp = strlen(pattern), lr = strlen(replace);
    char *dest = NULL, *ret = NULL;
    const char *temp = src, *last = NULL;
    while ((temp = kmp(temp, pattern)) != NULL)
    {
        count++;
        temp += lp;
    }

    dest = ret = (char *)malloc(sizeof(lr - lp) * count + strlen(src) + 1);
    if (ret == NULL) 
        return NULL;

    temp = src, last = src;
    while ((temp = kmp(temp, pattern)) != NULL)
    {
        //copy to dest
        memcpy(dest, last, temp - last);
        dest += temp - last;

        strcpy(dest, replace);
        dest += lr;

        temp += lp;
        last = temp;
    }
    strcpy(dest, last);
    return ret;
}

int main()
{
    char *dest = NULL;
    dest = str_replace("abcdefgabcdefgabcdefg", "fg", "----");
    if (dest != NULL)
        printf("%s\n", dest);
    free(dest);

    dest = str_replace("abcdefgabcdefgabcdefg", "ef", "----");
    if (dest != NULL)
        printf("%s\n", dest);
    free(dest);

    dest = str_replace("hello world", "l", "ab");
    if (dest != NULL)
        printf("%s\n", dest);
    free(dest);
    return 0;
}


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 连续查找字符串的程序段,查完程序窗口就死了求原因,求更好解法
  • 不用string库实现字符串替换

相关文章

  • 2017-06-07 七牛表单上传图片,不能覆盖?
  • 2017-06-07 如果栈的数目多于2个,如何实现共享空间
  • 2017-06-07 问天问地问自己pythonimport相关问题
  • 2017-06-07 关于Python中bytearray的使用场景的问题
  • 2017-06-07 求问python3有没有改mp3tag/id3好用的包并且改后可以在win下正常显示?
  • 2017-06-07 诺基亚手机的即显短信是如何实现的?
  • 2017-06-07 我想问下那些API是怎么调用的
  • 2017-06-07 Flask修改APPLICATION_ROOT无效
  • 2017-06-07 (golang)初学Go语言,对channel、并发的疑问
  • 2017-06-07 七牛上的页面访问出现{"error":"tokenmustbelastqueryfield"}

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • seam框架提交表单问题
    • python爬虫python正则匹配http包里cookie问题
    • (python)flask在请求各route之前统一的入口在哪?
    • python执行cmd命令遇到中文字符
    • 在python中如何判断字符串中是否有繁体中文?
    • ethhdr、iphdr、tcphdr、udphdr等结构体,以及在很多C程序中,命名结构体时都有hdr,hdr是什么意思呢?
    • 函数调用中参数传递的问题
    • udp数据包linux系统下udp包没有收到
    • 数组赋值如何获取数组对应键的值
    • pythonmysqldb解决format_dataa,'%Y-%d-%m'的冲突

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有