鱼C论坛

 找回密码
 立即注册
查看: 1241|回复: 1

[技术交流] 字符串替换思路,大佬们有没有想法或者意见!!!

[复制链接]
发表于 2020-3-27 20:17:56 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Cool_Breeze 于 2020-3-27 20:21 编辑

Dec-C++
.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stddef.h>
  4. #include <string.h>

  5. FILE* filepointer(const char *file,const char *mode);
  6. void insert_str(char* str,char* flag,size_t sl,size_t fn);
  7. void replace_gtr_str(char* str,char* flag,size_t sl,size_t fl);
  8. void replace_lss_str(char* str,char* flag,size_t subl,size_t fl);
  9. void replace_equ_str(char* str,char* flag,size_t fl);

  10. //字符串大小
  11. #define Max 1024

  12. int main(int argc,char **argv)
  13. {
  14.         FILE* fp=filepointer("test.txt","rb");
  15.         FILE* fpo=filepointer("result.txt","wb");       
  16.         static char str[Max];
  17.         static char substr[Max]={"88"};
  18.         static char flag[Max]={"Cool_Breeze"};
  19.         char *p=str;
  20.         while (fgets(str,Max,fp))
  21.         {
  22.                 p=str;
  23.                 for (;;)
  24.                 {
  25.                         p=strstr(p,substr);
  26.                         if (p == NULL) break;
  27.                         if (strlen(substr) < strlen(flag)) replace_lss_str(p,flag,strlen(substr),strlen(flag));
  28.                         else if (strlen(substr) > strlen(flag)) replace_gtr_str(p,flag,strlen(substr),strlen(flag));
  29.                         else if (strlen(substr) == strlen(flag)) replace_equ_str(p,flag,strlen(flag));
  30.                 }
  31.                 fprintf(fpo,"%s\n",str);
  32.         }
  33.         fclose(fp);
  34.         fclose(fpo);
  35.     return 0;
  36. }

  37. FILE* filepointer(const char *file,const char *mode)
  38. {
  39.         FILE *fp;
  40.         if (!(fp = fopen(file,mode)))
  41.         {
  42.                 printf("open fail! [%s]:%s\n",file,strerror(errno));
  43.                 exit(EXIT_FAILURE);
  44.         }
  45.         return fp;
  46. }
  47. /*
  48.         在字符串开始插入指定字符串
  49.         str  原字符串的起点
  50.         flag 指定字符串
  51.         sl   原字符串长度
  52.         fl   指定字符串长度
  53. */
  54. void insert_str(char* str,char* flag,size_t sl,size_t fl)
  55. {
  56.         char* pe=str+sl;//指向字符串‘\0’
  57.         char* pme=pe+fl;//指向后移flag大小后的位置
  58.         register size_t i=0;
  59.         for (i=0;i<=sl;i++)
  60.                 *(pme--)=*(pe--);//将余下所有字符往右移动fl
  61.         for (i=0;i<fl;i++)
  62.                 *(str++)=*(flag++);//将flag放入str后面
  63. }
  64. /*
  65.         被替换字符串长度大于替换字符字符串长度
  66.         explanation:
  67.         str=abcd,flag=abc
  68.        
  69.         str  原字符串的起点
  70.         flag 替换的字符串
  71.         sl   被替换字符长度
  72.         fl   替换字符串长度
  73. */
  74. void replace_gtr_str(char* str,char* flag,size_t sl,size_t fl)
  75. {
  76.         register size_t i=0;
  77.         for (i=0;i<fl;i++)
  78.                 *(str+i)=*(flag+i);//直接将flag放入str后面
  79.         char* pe=str+fl;//指向字符串‘\0’的位置
  80.         char* pme=pe+(sl-fl);
  81.         for (i=0;i<strlen(str+sl);i++)//strlen(str+sl)=剩余字符串长度
  82.                 *(pe++)=*(pme++);//将余下所有字符往左移动sl-fl
  83.         *pe='\0';//左移完成后添加结束符
  84. }
  85. /*
  86.         被替换字符长度小于替换字符串长度
  87.         删除被替换字符串
  88.         explanation:
  89.         str=abc,flag=abcd
  90.        
  91.         str  原字符串的起点
  92.         flag 替换的字符串
  93.         subl 被替换字符长度
  94.         fl   替换字符串长度
  95. */
  96. void replace_lss_str(char* str,char* flag,size_t subl,size_t fl)
  97. {
  98.         char* pe=str;
  99.         char* pme=pe+subl;
  100.         register size_t i=0;
  101.         for (i=0;i<strlen(str);i++)
  102.                 *(pe++)=*(pme++);
  103.         *pe='\0';
  104.         //调用插入字符串
  105.         insert_str(str,flag,strlen(str),fl);
  106. }
  107. /*
  108.         被替换字符串与指定字符串相等
  109.         explanation:
  110.         str=abc,flag=abc
  111.        
  112.         str  原字符串的起点
  113.         flag 替换的字符串
  114.         fl   替换字符长度
  115.          
  116. */
  117. void replace_equ_str(char* str,char* flag,size_t fl)
  118. {
  119.         register size_t i=0;
  120.         for (i=0;i<fl;i++)
  121.                 *(str++)=*(flag++);
  122. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-31 15:00:40 | 显示全部楼层
复制内存效率更高!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stddef.h>
  4. #include <string.h>

  5. FILE* filepointer(const char *file,const char *mode);
  6. void insert_str(char* str,char* flag,size_t sl,size_t fn);
  7. void replace_gtr_str(char* str,char* flag,size_t sl,size_t fl);
  8. void replace_lss_str(char* str,char* flag,size_t subl,size_t fl);
  9. void replace_equ_str(char* str,char* flag,size_t fl);

  10. //字符串大小
  11. #define Max 1024

  12. int main(int argc,char **argv)
  13. {
  14.         FILE* fp=filepointer("test.txt","rb");
  15.         FILE* fpo=filepointer("result.txt","wb");       
  16.         static char str[Max];
  17.         static char substr[Max]={"888"};
  18.         static char flag[Max]={"<A>"};
  19.         char *p=str;
  20.         while (fgets(str,Max,fp))
  21.         {
  22.                 p=str;
  23.                 for (;;)
  24.                 {
  25.                         p=strstr(p,substr);
  26.                         if (p == NULL) break;
  27.                         if (strlen(substr) < strlen(flag)) replace_lss_str(p,flag,strlen(substr),strlen(flag));
  28.                         else if (strlen(substr) > strlen(flag)) replace_gtr_str(p,flag,strlen(substr),strlen(flag));
  29.                         else if (strlen(substr) == strlen(flag)) replace_equ_str(p,flag,strlen(flag));
  30.                 }
  31.                 fprintf(fpo,"%s",str);
  32.         }
  33.         fclose(fp);
  34.         fclose(fpo);
  35.     return 0;
  36. }

  37. FILE* filepointer(const char *file,const char *mode)
  38. {
  39.         FILE *fp;
  40.         if (!(fp = fopen(file,mode)))
  41.         {
  42.                 printf("open fail! [%s]:%s\n",file,strerror(errno));
  43.                 exit(EXIT_FAILURE);
  44.         }
  45.         return fp;
  46. }
  47. /*
  48.         在字符串开始插入指定字符串
  49.         str  原字符串的起点
  50.         flag 指定字符串
  51.         sl   原字符串长度
  52.         fl   指定字符串长度
  53. */
  54. void insert_str(char* str,char* flag,size_t sl,size_t fl)
  55. {
  56.         memmove(str+fl,str,sl+1);//+1存放结束符'\0'
  57.         memmove(str,flag,fl);
  58. }
  59. /*
  60.         被替换字符串长度大于替换字符字符串长度
  61.         explanation:
  62.         str=abcd,flag=abc
  63.        
  64.         str  原字符串的起点
  65.         flag 替换的字符串
  66.         sl   被替换字符长度
  67.         fl   替换字符串长度
  68. */
  69. void replace_gtr_str(char* str,char* flag,size_t sl,size_t fl)
  70. {
  71.         memmove(str+fl,str+sl,sl+1);
  72.         memmove(str,flag,fl);
  73. }
  74. /*
  75.         被替换字符长度小于替换字符串长度
  76.         删除被替换字符串
  77.         explanation:
  78.         str=abc,flag=abcd
  79.        
  80.         str  原字符串的起点
  81.         flag 替换的字符串
  82.         subl 被替换字符长度
  83.         fl   替换字符串长度
  84. */
  85. void replace_lss_str(char* str,char* flag,size_t subl,size_t fl)
  86. {
  87.         register size_t temp=strlen(str)-subl;//剩余字符串长度
  88.         memmove(str+fl,str+subl,temp+1);
  89.         memmove(str,flag,fl);
  90. }
  91. /*
  92.         被替换字符串与指定字符串相等
  93.         explanation:
  94.         str=abc,flag=abc
  95.        
  96.         str  原字符串的起点
  97.         flag 替换的字符串
  98.         fl   替换字符长度
  99.          
  100. */
  101. void replace_equ_str(char* str,char* flag,size_t fl)
  102. {
  103.         memmove(str,flag,fl);
  104. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 11:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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