鱼C论坛

 找回密码
 立即注册
查看: 1112|回复: 0

[技术交流] C语言字符串查找并替换

[复制链接]
发表于 2020-7-29 17:21:29 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Cool_Breeze 于 2020-7-29 17:22 编辑

# BUG 每次都是在原地址中查找
# 所以替换字符串不能包含被替换字符串(替=’abc‘, 被=‘bc’)
# 导致无限循环
# 方法:
# 先查找,折叠找到的字符串
# 在折叠处插入字符串
  1. #if 0
  2.         By Cool_Breeze
  3.         Dev-C++ 5.11
  4.         .c
  5.         #endif
  6. #include <stdio.h>
  7. #include <string.h>

  8. void insert_str(char* str,char* flag,size_t sl,size_t fn);
  9. void fold(char* str,size_t rl,char* flag,size_t sl,size_t fl);

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

  12. int main(int argc,char **argv)
  13. {
  14.         static char src[Max];
  15.         static char sub[Max];
  16.         static char res[Max];
  17.        
  18.         if (argc != 4)
  19.         {
  20.                 printf("%d",argc);
  21.                 return 0;
  22.         }
  23.         strcpy(src, argv[1]);
  24.         strcpy(sub, argv[2]);
  25.         strcpy(res, argv[3]);
  26.        
  27.         register size_t srclen=strlen(src);
  28.         register size_t sublen=strlen(sub);
  29.         register size_t reslen=strlen(res);
  30.        
  31.         if (!srclen || !sublen || !reslen)
  32.         {
  33.                 printf("%s", src);
  34.                 return 0;
  35.         }
  36.         char *p = src;
  37.         while (*p)
  38.         {
  39.                 if ((p=strstr(p,sub)) == NULL) break;
  40.                 else fold(p,srclen,res,sublen,reslen);
  41.         }

  42.         printf("%s",src);

  43.     return 0;
  44. }

  45. /*
  46.         在字符串开始插入指定字符串
  47.         str  原字符串的起点
  48.         flag 指定字符串
  49.         sl   原字符串长度
  50.         fl   指定字符串长度
  51. */
  52. void insert_str(char* str,char* flag,size_t sl,size_t fl)
  53. {
  54.         memmove(str+fl,str,sl+1);//+1存放结束符'\0'
  55.         memmove(str,flag,fl);
  56. }
  57. /*
  58.         被替换字符串长度大于替换字符字符串长度
  59.         explanation:
  60.         str=abcd,flag=abc
  61.        
  62.         str  原字符串的起点
  63.         flag 替换的字符串
  64.         sl   被替换字符长度
  65.         fl   替换字符串长度
  66. */
  67. void fold(char* str,size_t rl,char* flag,size_t sl,size_t fl)
  68. {
  69.         memmove(str,str+sl,rl-sl+1);
  70.         insert_str(str,flag,rl,fl);
  71. }
复制代码
bat:
  1. @echo off
  2. set "s=三四ABCDE三四FG一二三四"
  3. 字符串查找及替换.exe "%s%" "三四" "Fishc"
  4. pause >nul

  5. FishcABCDEFishcFG一二Fishc
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-15 13:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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