找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 516|回复: 3

【C】SV高亮显示字符串

[复制链接]
发表于 2023-6-15 05:02:23 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

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

×
本帖最后由 usr 于 2023-6-15 05:05 编辑

6月14号 StoneValley 发布了新版本。在新版本中 svstring.h 线性数据结构库增添了一个函数:strCreateZSearchArrayZ。
这个函数用来查找一个字符串内符合一定模式的所有子串。熟悉算法的同学应该了解这个功能。KMP算法实现了此功能。但是在SV中,实现查找子串功能的函数使用了Z算法。
Z算法也被称作扩展KMP算法。是一种时间效率极高的(O(n))字符串匹配算法。
大家可以去StoneValley的主页查看该函数:https://github.com/coshcage/StoneValley/blob/master/src/svarray.c
此外我将如何配置SV的帖子贴在这里,以供大家参考:https://www.0xaa55.com/thread-27369-1-1.html
说到字符串匹配,不得不提Unix下的grep命令。
echo "The quick brown fox jumps over the lazy dog." | grep "the"
以上命令可以高亮显示echo句子中的所有the。
接下来,我教大家做一个高亮字符串的应用。我把它命名为vrcat。意思是Visual Red Cat。代码如下:

  1. /* vrcat for Visual Red Cat.
  2. * (C) cosh.cage#hotmail.com
  3. * 06/15/2023
  4. */
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include "svstring.h"

  9. int main(int argc, char * argv[])
  10. {
  11.         int ch;
  12.         size_t i = 0, m;
  13.         ARRAY_Z * parrtxt, arrptn, * parr; // 三个ARRAY_Z分别是文本串,模式串和匹配结果串。
  14.        
  15.         if (argc < 2)
  16.                 return 0;
  17.         arrptn.pdata = argv[1]; // 模式串为输入参数。
  18.         arrptn.num = strlen(argv[1]); // 模式串的长度。
  19.        
  20.         if (arrptn.num < 1)
  21.                 return 0;

  22.         parrtxt = strCreateArrayZ(BUFSIZ, sizeof(char));
  23.         if (NULL == parrtxt)
  24.                 return 0;
  25.        
  26.         while (!feof(stdin)) // 以下代码是将stdin所有内容读入parrtxt。
  27.         {
  28.                 ch = fgetc(stdin);
  29.                 parrtxt->pdata[i] = (UCHART)ch;
  30.                 if (++i > strLevelArrayZ(parrtxt))
  31.                         if (NULL == strResizeArrayZ(parrtxt, strLevelArrayZ(parrtxt) + BUFSIZ, sizeof(char)))
  32.                                 return 0;
  33.         }
  34.         if (NULL == strResizeArrayZ(parrtxt, i, sizeof(char)))
  35.                 return 0;

  36.         parr = strCreateZSearchArrayZ(parrtxt, &arrptn, sizeof(char)); // 使用Z算法查找子串所有出现位置。

  37.         if (NULL != parr)
  38.         {
  39.                 BOOL b = FALSE;
  40.                 size_t j, k;

  41.                 for (j = i = 0; i < strLevelArrayZ(parrtxt) - 1; ++i)
  42.                 {
  43.                         if (j[(size_t *)parr->pdata] == i) // 如果出现位置和当前打印位置相匹配。
  44.                         {
  45.                                 b = TRUE;
  46.                                 k = 0;
  47.                                 ++j;
  48.                         }
  49.                         if (b)
  50.                                 printf("%s", "\e[31m"); // 打印高亮首部,
  51.                         fputc(parrtxt->pdata[i], stdout); // 打印字符。
  52.                         if (++k >= strLevelArrayZ(&arrptn))
  53.                         {
  54.                                 printf("%s", "\e[0m"); // 打印高亮尾部。
  55.                                 b = FALSE;
  56.                         }
  57.                 }
  58.                 m = parr->num;
  59.                 strDeleteArrayZ(parr);
  60.         }

  61.         strDeleteArrayZ(parrtxt);

  62.         return m;
  63. }
复制代码

运行效果是这样的:
1.png
strCreateZSearchArrayZ 函数的执行效率很高,因此vrcat的速率也很快。strCreateZSearchArrayZ函数也能处理wchar_t类型,需要读者自行修改代码。
关于Ubuntu 终端上如何高亮显示字符,我找到的相关资料在这里:https://askubuntu.com/questions/623855/changing-the-text-color-in-ubuntu-terminal
https://misc.flogisoft.com/bash/tip_colors_and_formatting
好了,以上就是本贴的全部内容,欢迎大家下载测试。
回复

使用道具 举报

发表于 2023-6-15 17:49:05 | 显示全部楼层
https://tangptr.com/2022/create- ... sole-with-escaping/

在控制台上高亮用的是ASCII-Escaping字符序列,需要控制台支持。
此外并非所有编译器都认识\e,兼容性起见用\x1b
我之前也写过类似的东西,在虚拟环境里以MMIO的方式写一个模拟控制台,然后虚拟机软件以走命名管道转发给PuTTY。


Windows 7 x64-2023-06-15-17-29-18.png
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2023-6-16 12:38:22 | 显示全部楼层
tangptr@126.com 发表于 2023-6-15 17:49
https://tangptr.com/2022/create-extra-consoles-for-your-program-control-your-extra-console-with-esca ...

好的,感谢提醒和参与回复!
回复 赞! 靠!

使用道具 举报

发表于 2023-6-16 22:06:09 | 显示全部楼层
看不明白你要展示哪种技术 Z算法还是彩色字?
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-23 16:22 , Processed in 0.040932 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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