鱼C论坛

 找回密码
 立即注册
查看: 1804|回复: 5

[已解决]编程题4

[复制链接]
发表于 2021-11-12 14:39:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
【问题描述】

将字符串str中的子字符串s1替换成新的子字符串s2(字符串长度<100),如果字符串str中有多个s1,则应全部替换,最后输出被替换后的str字符串。



【输入形式】

输入3行,第一行是:字符串,第二行是:被替换子串,第三行是:替换子串



【输出形式】

替换后的字符串


【样例输入1】

hello word!

word

C  program



【样例输出1】

hello C program!



【样例输入2】

hello word!

o

w



【样例输出2】

hellw wwrd!
最佳答案
2021-11-14 10:31:48
lsdsg 发表于 2021-11-13 23:38
带哥它要求  如果字符串str中有多个s1,则应全部替换  能再改进下吗

字符串 s1 中的多个子字符串 s2 全部替换成 s3:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* replace(const char* str, const char* old, const char* new)
{
        char* result;
        int i, count = 0;
        int n = strlen(new);
        int m = strlen(old);
        for (i = 0; str[i] != '\0'; i++) {
                if (strstr(&str[i], old) == &str[i]) {
                        count++;
                        i += m - 1;
                }
        }
        result = (char*)malloc(i + count * (n - m) + 1);
        i = 0;
        while (*str) {
                if (strstr(str, old) == str) {
                        strcpy(&result[i], new);
                        i += n;
                        str += m;
                }
                else result[i++] = *str++;
        }
        result[i] = '\0';
        return result;
}

int main()
{
        char str[100], old[100], new[100];
        scanf("%[^\n]", str);
        getchar();
        scanf("%[^\n]", old);
        getchar();
        scanf("%[^\n]", new);
        getchar();
        char* result = NULL;
        result = replace(str, old, new);
        printf("%s", result);
        free(result);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-12 16:06:58 | 显示全部楼层
本帖最后由 jhq999 于 2021-11-12 16:09 编辑
int Changestr(char* inch,char* srcch,char* drcch)
{
        int i=0,j=0,k=0,len;
        while(inch[i++]);
        len=i;
        char *tmp=new char[len];
        i=0;
        while(inch[i])
        {
                j=0;
                if(inch[i]==srcch[j])
                {
                        
                        while((inch[i+j]==srcch[j])&&inch[i+j])j++;
                        if(!srcch[j])
                        {
                                for (k = i+j; inch[k]; k++)
                                {
                                        tmp[k-i-j]=inch[k];
                                }
                                tmp[k-i-j]=inch[k];
                                
                                for (j=i; drcch[i-j]; i++)
                                {
                                        inch[i]=drcch[i-j];
                                }
                                
                                for (j = 0;tmp[j]; j++)
                                {
                                        inch[i+j]=tmp[j];
                                }
                                inch[i+j]=tmp[j];
                        }

                }
                i++;
        }
        delete[] tmp;
        return 0;
}
int main ()
{
        //CallID(5);
        char ch[256]={0},oldch[64]={0},newch[64]={0};
        scanf("%[^\n]",ch);
        getchar();
        scanf("%[^\n]",oldch);
        getchar();
        scanf("%[^\n]",newch);
        getchar();
        Changestr(ch,oldch,newch);
        printf("%s",ch);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-12 17:27:41 | 显示全部楼层
本帖最后由 jackz007 于 2021-11-13 23:50 编辑
#include <stdio.h>

char * replace(char s[] , char s1[] , char s2[])
{
        int i , j , k , m , n , p                                                                             ;
        for(m = 0 ; s[m]  ; m ++)                                                                             ;
        for(n = 0 ; s1[n] ; n ++)                                                                             ;
        for(p = 0 ; s2[p] ; p ++)                                                                             ;
        for(i = 0 ; i < m - n + 1 ; i ++) {
                for(j = 0 ; j < n ; j ++) if(s[i + j] != s1[j]) break                                         ;
                if(j == n && j > 0) {
                        if(p > n) for(k = 0 ; k < m - (i + n) + 1 ; k ++) s[m + p - n - k] = s[m - k]         ;
                        else if(p < n) for(k = 0 ; k < m - (i + n) + 1 ; k ++) s[i + p + k] = s[i + n + k]    ;
                        for(k = 0 ; k < p ; k ++) s[i + k] = s2[k]                                            ;
                        m += p - n                                                                            ;
                        i += p - 1                                                                            ;
                }
        }
        return s                                                                                              ;
}

int main(void)
{
        char s[256] , s1[256] , s2[256]                                                                       ;
        gets(s)                                                                                               ;
        gets(s1)                                                                                              ;
        gets(s2)                                                                                              ;
        printf("%s\n" , replace(s , s1 , s2))                                                                 ;
}
        编译、运行实况:
D:\0002.Exercise\C>g++ -o x x.c

D:\0002.Exercise\C>x
hello word!
word
C  program
hello C  program!

D:\0002.Exercise\C>x
hello word!
o
w
hellw wwrd!

D:\0002.Exercise\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-13 23:38:52 | 显示全部楼层
jackz007 发表于 2021-11-12 17:27
编译、运行实况:

带哥它要求  如果字符串str中有多个s1,则应全部替换  能再改进下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-13 23:49:19 | 显示全部楼层
lsdsg 发表于 2021-11-13 23:38
带哥它要求  如果字符串str中有多个s1,则应全部替换  能再改进下吗

        就是全替换啊,你试过吗,难道不行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-14 10:31:48 | 显示全部楼层    本楼为最佳答案   
lsdsg 发表于 2021-11-13 23:38
带哥它要求  如果字符串str中有多个s1,则应全部替换  能再改进下吗

字符串 s1 中的多个子字符串 s2 全部替换成 s3:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* replace(const char* str, const char* old, const char* new)
{
        char* result;
        int i, count = 0;
        int n = strlen(new);
        int m = strlen(old);
        for (i = 0; str[i] != '\0'; i++) {
                if (strstr(&str[i], old) == &str[i]) {
                        count++;
                        i += m - 1;
                }
        }
        result = (char*)malloc(i + count * (n - m) + 1);
        i = 0;
        while (*str) {
                if (strstr(str, old) == str) {
                        strcpy(&result[i], new);
                        i += n;
                        str += m;
                }
                else result[i++] = *str++;
        }
        result[i] = '\0';
        return result;
}

int main()
{
        char str[100], old[100], new[100];
        scanf("%[^\n]", str);
        getchar();
        scanf("%[^\n]", old);
        getchar();
        scanf("%[^\n]", new);
        getchar();
        char* result = NULL;
        result = replace(str, old, new);
        printf("%s", result);
        free(result);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 23:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表