鱼C论坛

 找回密码
 立即注册
查看: 2095|回复: 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:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. char* replace(const char* str, const char* old, const char* new)
  5. {
  6.         char* result;
  7.         int i, count = 0;
  8.         int n = strlen(new);
  9.         int m = strlen(old);
  10.         for (i = 0; str[i] != '\0'; i++) {
  11.                 if (strstr(&str[i], old) == &str[i]) {
  12.                         count++;
  13.                         i += m - 1;
  14.                 }
  15.         }
  16.         result = (char*)malloc(i + count * (n - m) + 1);
  17.         i = 0;
  18.         while (*str) {
  19.                 if (strstr(str, old) == str) {
  20.                         strcpy(&result[i], new);
  21.                         i += n;
  22.                         str += m;
  23.                 }
  24.                 else result[i++] = *str++;
  25.         }
  26.         result[i] = '\0';
  27.         return result;
  28. }

  29. int main()
  30. {
  31.         char str[100], old[100], new[100];
  32.         scanf("%[^\n]", str);
  33.         getchar();
  34.         scanf("%[^\n]", old);
  35.         getchar();
  36.         scanf("%[^\n]", new);
  37.         getchar();
  38.         char* result = NULL;
  39.         result = replace(str, old, new);
  40.         printf("%s", result);
  41.         free(result);
  42.         return 0;
  43. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-12 16:06:58 | 显示全部楼层
本帖最后由 jhq999 于 2021-11-12 16:09 编辑
  1. int Changestr(char* inch,char* srcch,char* drcch)
  2. {
  3.         int i=0,j=0,k=0,len;
  4.         while(inch[i++]);
  5.         len=i;
  6.         char *tmp=new char[len];
  7.         i=0;
  8.         while(inch[i])
  9.         {
  10.                 j=0;
  11.                 if(inch[i]==srcch[j])
  12.                 {
  13.                        
  14.                         while((inch[i+j]==srcch[j])&&inch[i+j])j++;
  15.                         if(!srcch[j])
  16.                         {
  17.                                 for (k = i+j; inch[k]; k++)
  18.                                 {
  19.                                         tmp[k-i-j]=inch[k];
  20.                                 }
  21.                                 tmp[k-i-j]=inch[k];
  22.                                
  23.                                 for (j=i; drcch[i-j]; i++)
  24.                                 {
  25.                                         inch[i]=drcch[i-j];
  26.                                 }
  27.                                
  28.                                 for (j = 0;tmp[j]; j++)
  29.                                 {
  30.                                         inch[i+j]=tmp[j];
  31.                                 }
  32.                                 inch[i+j]=tmp[j];
  33.                         }

  34.                 }
  35.                 i++;
  36.         }
  37.         delete[] tmp;
  38.         return 0;
  39. }
  40. int main ()
  41. {
  42.         //CallID(5);
  43.         char ch[256]={0},oldch[64]={0},newch[64]={0};
  44.         scanf("%[^\n]",ch);
  45.         getchar();
  46.         scanf("%[^\n]",oldch);
  47.         getchar();
  48.         scanf("%[^\n]",newch);
  49.         getchar();
  50.         Changestr(ch,oldch,newch);
  51.         printf("%s",ch);
  52.         return 0;
  53. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. char * replace(char s[] , char s1[] , char s2[])
  3. {
  4.         int i , j , k , m , n , p                                                                             ;
  5.         for(m = 0 ; s[m]  ; m ++)                                                                             ;
  6.         for(n = 0 ; s1[n] ; n ++)                                                                             ;
  7.         for(p = 0 ; s2[p] ; p ++)                                                                             ;
  8.         for(i = 0 ; i < m - n + 1 ; i ++) {
  9.                 for(j = 0 ; j < n ; j ++) if(s[i + j] != s1[j]) break                                         ;
  10.                 if(j == n && j > 0) {
  11.                         if(p > n) for(k = 0 ; k < m - (i + n) + 1 ; k ++) s[m + p - n - k] = s[m - k]         ;
  12.                         else if(p < n) for(k = 0 ; k < m - (i + n) + 1 ; k ++) s[i + p + k] = s[i + n + k]    ;
  13.                         for(k = 0 ; k < p ; k ++) s[i + k] = s2[k]                                            ;
  14.                         m += p - n                                                                            ;
  15.                         i += p - 1                                                                            ;
  16.                 }
  17.         }
  18.         return s                                                                                              ;
  19. }

  20. int main(void)
  21. {
  22.         char s[256] , s1[256] , s2[256]                                                                       ;
  23.         gets(s)                                                                                               ;
  24.         gets(s1)                                                                                              ;
  25.         gets(s2)                                                                                              ;
  26.         printf("%s\n" , replace(s , s1 , s2))                                                                 ;
  27. }
复制代码

        编译、运行实况:
  1. D:\0002.Exercise\C>g++ -o x x.c

  2. D:\0002.Exercise\C>x
  3. hello word!
  4. word
  5. C  program
  6. hello C  program!

  7. D:\0002.Exercise\C>x
  8. hello word!
  9. o
  10. w
  11. hellw wwrd!

  12. D:\0002.Exercise\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

带哥它要求  如果字符串str中有多个s1,则应全部替换  能再改进下吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

        就是全替换啊,你试过吗,难道不行?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  4. char* replace(const char* str, const char* old, const char* new)
  5. {
  6.         char* result;
  7.         int i, count = 0;
  8.         int n = strlen(new);
  9.         int m = strlen(old);
  10.         for (i = 0; str[i] != '\0'; i++) {
  11.                 if (strstr(&str[i], old) == &str[i]) {
  12.                         count++;
  13.                         i += m - 1;
  14.                 }
  15.         }
  16.         result = (char*)malloc(i + count * (n - m) + 1);
  17.         i = 0;
  18.         while (*str) {
  19.                 if (strstr(str, old) == str) {
  20.                         strcpy(&result[i], new);
  21.                         i += n;
  22.                         str += m;
  23.                 }
  24.                 else result[i++] = *str++;
  25.         }
  26.         result[i] = '\0';
  27.         return result;
  28. }

  29. int main()
  30. {
  31.         char str[100], old[100], new[100];
  32.         scanf("%[^\n]", str);
  33.         getchar();
  34.         scanf("%[^\n]", old);
  35.         getchar();
  36.         scanf("%[^\n]", new);
  37.         getchar();
  38.         char* result = NULL;
  39.         result = replace(str, old, new);
  40.         printf("%s", result);
  41.         free(result);
  42.         return 0;
  43. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 13:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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