【问题标题】:Searching for a substring in a String among NULL characters in text file在文本文件中的 NULL 字符中搜索字符串中的子字符串
【发布时间】:2016-02-05 21:17:20
【问题描述】:

嘿,我想在文件中搜索子字符串“Step1”并用我的代码搜索它。尽管该文件包含 NULL 字符(主要是 HEX 字符)。在我的文件中使用这些 Null 字符,我的解析器失败并返回 true。我已经尝试并搜索了很多关于替换和删除 NULL 字符的材料,但都是徒劳的。 这是我的解析器:

char *str="Step1";
fp=fopen(fname, "rb");
if(NULL == fp)
    return(-1);
while(fgets(temp, 400, fp)!= NULL) 
{
    if((strstr(temp, str1))!= NULL)
        {
            system("start Step1.bat");
            count_step[0]++;
        }
}
if(fp)
   fclose(fp);

这是我的文本文件的样子:

NULLNULLNULLNULLStep1NULLNULLNULL
NULLNULLStep1

请给我建议一个我可以合并的快速解决方案

【问题讨论】:

  • 如果文件是文本文件,为什么要以二进制模式打开?这可能会阻止fgets 正常工作。如果文件实际上不是文本文件,而您向我们展示的 NULL 实际上是二进制零,那么您就不能使用像 fgetsstrstr 这样的文本函数。你能澄清一下吗?
  • 不使用字符串函数,自己写自定义strstr就好了。这样,您可以根据需要处理 NULL 字符或任何其他字符。
  • 那么文件可能确实是二进制文件,你不能使用像strstr这样的字符串函数,因为'\0'字符是字符串终止符,如果在字符串之前有一个你搜索你永远不会找到它。
  • strstr 在这里不起作用,因为它只搜索子字符串,直到找到 NULL 字符。您的文件的写入方式不是纯粹的字符串。例如,如果你的文件是一个文本文件,它会是这样的SPACESPACESPACEStep1SPACESPACESPACE,因为你不能在文本文件中写一个 NULL。
  • @naruto:“null”字符是 \0(或 \x00,这是写 0 的另一种方式。)\x0a 不是空字符。这是一个换行符。并且没有“十六进制”字符之类的东西;所有字符都被编码为小整数,如果你愿意,你可以用十六进制写整数。例如,小写“a”编码为 97,或 \0x61。

标签: c string search replace null


【解决方案1】:

如果文件是二进制文件,则不能使用 fgetsstrstr 等字符串处理函数。

一种可能(但速度较慢)的解决方案是使用fread 读取一大块数据,然后使用memcmp 在文件中的所有数据上搜索“字符串”。作为一个很简单的优化,先寻找字符串中的第一个字节,然后使用memcmp

其他解决方案可能包括搜索树,例如 a trie

【讨论】:

    猜你喜欢
    • 2015-11-02
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多