我正在尝试在给定文件中找到一个字符串(实际上该文件是tar文件(请注意这里)并且我在记事本++中打开文件并从该打开的文件中随机取一个字符串)并且我存储了完整的tar文件在缓冲区中,现在我想找到我在存储缓冲区中使用strstr函数复制的字符串的位置。
要做的代码是这(绝对正确) -
char *compare= "_.png"; //suppose this is the copied string
//which is to be find out in buffer using strstr
char * StartPosition;
StartPosition = strstr (buffer,compare);
__int64 count=0;
MessageBox(m_hwndPreview,L"before the while loop",L"BTN WND6",MB_ICONINFORMATION);
while (StartPosition!=NULL)
{
MessageBox(m_hwndPreview,L"hurr inside the while loop",L"BTN WND6",MB_ICONINFORMATION);
MessageBoxA(m_hwndPreview,strerror(errno),"BTN WND4", MB_ICONINFORMATION);
count=StartPosition-buffer+1;
return 0;
}
并假设我在记事本中有tar文件的内容,如下所示,我复制了比较中存储的这个字符串 -
3_VehicleWithKinematicsAndAerodynamics_.000.png IHDR (here is some strange data which can't be copied and also there are lot of NULL but we have to find out the position of "_.png" so not so difficult in this case ).
问题是我的代码工作正常,直到我在.png之前存储数据然后我能够使用strstr找到它的位置问题是当我试图找出出现在
之后的字符串位置`3_VehicleWithKinematicsAndAerodynamics_.000.png IHDR ...suppose here we have strange data (which is data block if we see the tar parser)...after this we have another file like..."3_VehicleWithKinematicsAndAerodynamics_.html"`
如果我想使用strstr找到这个“3_VehicleWithKinematicsAndAerodynamics_.html”,那么由于它们之间的奇怪数据,我无法找到它。(因为我认为那些数据不被编译器识别,而是dut到那个我无法访问位于奇怪数据之后的文件) 更清楚地看到tar文件中文件的位置如下 -
3_VehicleWithKinematicsAndAerodynamics_.000.png IHDR ............(its data blocl-which is strange contents if you open in tar file)....3_VehicleWithKinematicsAndAerodynamics_.000.html
我必须使用strstr访问.html文件。为什么它不访问它?有任何想法吗 ?? *
请给出实现它的替代方案......我确信我尝试的东西不起作用..
答案 0 :(得分:2)
C样式字符串是由零字符(NUL字符 - 值零,而不是字符'0')终止的字符数。这意味着strstr
会在遇到这样一个字节时立即停止。
一个非常合理的解决方案是简单地编写一个函数,根据它的长度搜索二进制数据,而不是“终止字符”。
这样的事情(这仍假设str
是C风格的字符串):
char *find_str_in_data(const char *str, const char *data, int length)
{
int pos = 0;
int slen = strlen(str);
while(pos < length-slen)
{
int i = 0;
while(i < slen && str[i] = data[pos+i])
{
i++;
}
if (i == slen)
return data + pos;
}
return NULL;
}
答案 1 :(得分:0)
如果您确实想使用strstr
,则需要使用'\0'
转义缓冲区中包含的字符串。如果您知道放入缓冲区的数据大小(比方说,sizeOfData
),那么在使用strstr
之前,您可能会这样做:
buffer[sizeOfData] = '\0';
警告:如果sizeOfData
等于缓冲区的大小,那么您将需要更大的缓冲区或用'\0'
覆盖最后一个字符(在第二种情况下)你应该手动检查缓冲区尾部,因为你覆盖的字符可能是你正在寻找的序列之一。