【发布时间】: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实际上是二进制零,那么您就不能使用像fgets或strstr这样的文本函数。你能澄清一下吗? -
不使用字符串函数,自己写自定义
strstr就好了。这样,您可以根据需要处理 NULL 字符或任何其他字符。 -
那么文件可能确实是二进制文件,你不能使用像
strstr这样的字符串函数,因为'\0'字符是字符串终止符,如果在字符串之前有一个你搜索你永远不会找到它。 -
strstr在这里不起作用,因为它只搜索子字符串,直到找到 NULL 字符。您的文件的写入方式不是纯粹的字符串。例如,如果你的文件是一个文本文件,它会是这样的SPACESPACESPACEStep1SPACESPACESPACE,因为你不能在文本文件中写一个 NULL。 -
@naruto:“null”字符是 \0(或 \x00,这是写 0 的另一种方式。)\x0a 不是空字符。这是一个换行符。并且没有“十六进制”字符之类的东西;所有字符都被编码为小整数,如果你愿意,你可以用十六进制写整数。例如,小写“a”编码为 97,或 \0x61。
标签: c string search replace null