C 检查文件中是否有字符串

C 检查文件中是否有字符串,c,string,file,binaryfiles,strstr,C,String,File,Binaryfiles,Strstr,我一直在尝试制作一个程序来检查一个文件是否包含另一个文件的。(就像一个反病毒软件)。我试图使用strstr()来实现这一点,但显然strstr()的工作效果不太好 检查文件中是否包含其他文件的最佳解决方案是什么? 编辑:我正在处理二进制文件。您可以实现Knuth-Morris-Pratt算法,这是解决您遇到的问题的最佳解决方案之一 关于字符串匹配问题的其他解决方案也值得探索和学习。 有关字符串搜索算法的列表,请参见 了解KMP算法的资源: 注意:您也可以对字节使用这些算法。比较C中任意字

我一直在尝试制作一个程序来检查一个文件是否包含另一个文件的。(就像一个反病毒软件)。我试图使用strstr()来实现这一点,但显然strstr()的工作效果不太好

检查文件中是否包含其他文件的最佳解决方案是什么?
编辑:我正在处理二进制文件。

您可以实现Knuth-Morris-Pratt算法,这是解决您遇到的问题的最佳解决方案之一

关于字符串匹配问题的其他解决方案也值得探索和学习。
有关字符串搜索算法的列表,请参见

了解KMP算法的资源:


注意:您也可以对字节使用这些算法。

比较C中任意字节序列的方法是使用
memcmp
。这是一个标准的C89函数。

memmem
函数,它在数据文件中查找子序列。
strstr
相比,
memmem
函数不会停在
\0
上,它可以让您在任何文件中找到任何数据。

您最好的解决方案是重写这个问题,因为我不明白您试图实现什么,也不知道您尝试发布代码的内容。另外,修复邮件的拼写。如果正确加载文件,strstr应该可以工作。文件只是字节流。它们通常是二进制的,因此使用strstr()处理它们是不正确的。您必须知道您要查找的文件类型。例如,它是文本文件还是二进制文件,或者如果它包含一些常见的标记等,则将此文件作为字节而不是字符串读取,然后根据适当的标准尝试解析它。似曾相识:注意:这不适用于无法放入memory@NemanjaTrifunovic只有当你想把整个文件存储在内存中时。如果需要处理过大的文件,可以一次比较一个块。或内存映射文件。
memmem()函数在长度为haystacklen的内存区域haystack中查找长度为needlelen的子字符串指针的第一个匹配项的开始。
用于字符串,而不是二进制数据。我想这不会管用,不过我自己也没试过。@Jens:我同意。但我也认为这有点复杂,因为你不知道一个文件在另一个文件中的位置,所以你需要检查所有可能的位置,这不是最佳的。@UDKOX否,
memmem
根据手册页对二进制数据起作用。但它是GNU扩展,不是C89函数。但不将这些文件视为字符串:字节上的D KMP为possible@MichałMielec:是的,这是我在本例中如何使用这些算法的想法:)我在我的答案中添加了一条关于这一点的注释。