| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1463 人关注过本帖
标题:字符串替换处理 。各位大神进来看一下,帮忙解决一下。
只看楼主 加入收藏
阿联酋
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-11-22
结帖率:0
收藏
已结贴  问题点数:10 回复次数:14 
字符串替换处理 。各位大神进来看一下,帮忙解决一下。
给定三个字符串,查找第一个字符串是否包含第二个字符串,如果包含,则将第三个字符串替换第二个字符串(第一个字符串可能多次包含第二个字符串); 例如:对于字符串“abcabcdefghij”、“fgh”、“sk”,则程序输出“abcabcdeskij”。
 

提示:1)确定合法字符集合;

2)对输入字符串的合法性进行判断。

搜索更多相关主题的帖子: 合法性 字符串 
2016-12-14 15:18
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
我把老帖都翻出来了~里面有这个东东~

编程论坛 - 数组与指针的问题,跳出“停止工作”的对话框,请问哪里错误?
https://bbs.bccn.net/viewthread.php?tid=471176&page=1#pid2598960

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-14 22:07
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
当然,如果想快点的话就用strstr,搭配sprintf+指针-----因为你那个替换字符不一定是等长的~

或者是先删除再插入,字符串的尾部可能要移动,不是等长替换就是要弄多点东西~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-14 22:24
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
自己做了一下,不用<string.h>

这个是原始版的~

程序代码:
/*字符串替换,(不加<string.h>)*/

#include<stdio.h>

int Mystrlen(char *p)
{
    char *ps=p;

    for (;*ps;++ps);

    return (ps-p);
}
char *Mystrstr(char *p1,char *p2)
{
    char *ps=p2;

    for (;*p1&&*p2;++p1)
        if (*p1==*p2)
            ++p2;
        else if (*ps!=*p1)  
            p2=ps;
        else              //这个要加,当p1正好为ps的第一个字母时p2要+1~
            p2=ps+1;

    if (*p1=='\0'&&*p2!='\0')  
        return NULL;

    return (p1-(p2-ps));    //p2-ps为ps的长度~
}
void Move(char *p1,char *p3,int len_s2,int len_s3)
{
    char *ps=p1;

    int len=len_s2-len_s3;
    
    if (len>0)                  //要分类讨论,len>0;len<0;len==0
        for (p1=ps+len;*p1;++p1)
            *p1=*(p1+1);

    if (len<0)      //当len<0时,字符串要移向尾部
    {
        char *pe=NULL;

        for (;*p1;*p1++); 

        pe=p1-len;
    
           for (;p1!=ps;--p1,--pe)   
            *pe=*p1;
    }

    for (p1=ps;*p3;++p3,++p1)
        *p1=*p3;
}
int main()
{
    char s1[80]="abccdabcdabccdabcdabbcd";
    char s2[]="cd";
    char s3[]="zzz";

    char *p1=s1;

    int len_s2=Mystrlen(s2);
    int len_s3=Mystrlen(s3);

    puts(s1);      //这个输出用来检验

    while (*p1)
    {
        p1=Mystrstr(p1,s2);

        if (p1==NULL)
            break;

         Move(p1,s3,len_s2,len_s3);

        ++p1;
    }

    puts(s1);

    return 0;
}


[此贴子已经被作者于2016-12-15 03:18编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-15 02:34
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
这个是装备版的~

程序代码:
/*字符串替换*/

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

int main()
{
    char s1[80]="abccdabcdabccdabcdabbcd";
    char s2[]="cd";
    char s3[]="zzz";
    char copy_s1[80]="\0";

    char *p1=s1;

    int len_s2=strlen(s2);

    puts(s1);      //这个输出用来检验

    while (*p1)
    {
        p1=strstr(p1,s2);

        if (p1==NULL)
            break;

        strcpy(copy_s1,p1+len_s2);
        sprintf(p1++,"%s%s",s3,copy_s1);
    }

    puts(s1);

    return 0;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-15 03:11
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
//做完题目后,终于理解

提示:1)确定合法字符集合;

2)对输入字符串的合法性进行判断。


是什么意思了,意思就是说要判断替第二个字符串与第三个字符串长度的大小关系。第二个字符串比第三个长或者相等,则字符串移动起点在替换点+第二个字符串的长度;如果第二个字符串比第三个字符串短,则字符串移动起点在字符串尾部+第三个字符串与第二个字符串的长度差。

不过,用装备版strstr+strcpy+sprintf则不用考虑这种情况

[此贴子已经被作者于2016-12-15 03:30编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-15 03:27
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10559
专家分:42996
注 册:2014-5-20
收藏
得分:5 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
    char s1[]="abcabcdefghijfgh";
    char s2[]="fgh";
    char s3[]="sk";
    char *p;
    p = strtok(s1, s2);
    printf("%s", p);
    p = strtok(NULL,s2);
    printf("%s%s",s3, p);
}
2016-12-15 06:14
阿联酋
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-11-22
收藏
得分:0 
回复 4楼 九转星河
后面的那些要不要打进去
2016-12-15 10:33
阿联酋
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-11-22
收藏
得分:0 
回复 4楼 九转星河
不要这个,把他换成随便输入的字符,然后再来替换  要怎么弄
    char s1[80]="abccdabcdabccdabcdabbcd";
    char s2[]="cd";
    char s3[]="zzz";
2016-12-15 10:44
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 9楼 阿联酋
可以用scanf("%s%s%s",s1,s2,s3);来自行处理~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-15 14:35
快速回复:字符串替换处理 。各位大神进来看一下,帮忙解决一下。
数据加载中...
 
   



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

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