批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

C语言字符串查找并替换

本帖最后由 Gin_Q 于 2020-7-29 16:26 编辑

# 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. if (argc != 4)
  18. {
  19. printf("%d",argc);
  20. return 0;
  21. }
  22. strcpy(src, argv[1]);
  23. strcpy(sub, argv[2]);
  24. strcpy(res, argv[3]);
  25. register size_t srclen=strlen(src);
  26. register size_t sublen=strlen(sub);
  27. register size_t reslen=strlen(res);
  28. if (!srclen || !sublen || !reslen)
  29. {
  30. printf("%s", src);
  31. return 0;
  32. }
  33. char *p = src;
  34. while (*p)
  35. {
  36. if ((p=strstr(p,sub)) == NULL) break;
  37. else fold(p,srclen,res,sublen,reslen);
  38. }
  39. printf("%s",src);
  40.     return 0;
  41. }
  42. /*
  43. 在字符串开始插入指定字符串
  44. str  原字符串的起点
  45. flag 指定字符串
  46. sl   原字符串长度
  47. fl   指定字符串长度
  48. */
  49. void insert_str(char* str,char* flag,size_t sl,size_t fl)
  50. {
  51. memmove(str+fl,str,sl+1);//+1存放结束符'\0'
  52. memmove(str,flag,fl);
  53. }
  54. /*
  55. 被替换字符串长度大于替换字符字符串长度
  56. explanation:
  57. str=abcd,flag=abc
  58. str  原字符串的起点
  59. flag 替换的字符串
  60. sl   被替换字符长度
  61. fl   替换字符串长度
  62. */
  63. void fold(char* str,size_t rl,char* flag,size_t sl,size_t fl)
  64. {
  65. memmove(str,str+sl,rl-sl+1);
  66. insert_str(str,flag,rl,fl);
  67. }
复制代码
bat:
  1. @echo off
  2. set "s=三四ABCDE三四FG一二三四"
  3. 字符串查找及替换.exe "%s%" "三四" "bathome"
  4. pause >nul
  5. bathomeABCDEbathomeFG一二bathome
复制代码

返回列表