读书人

怎么在一个含有 quot;\0quot; 的字符串里查找

发布时间: 2012-12-31 11:57:51 作者: rapoo

如何在一个含有 "\0" 的字符串里查找指定的字符串?
我用recv从网上接收到一串数据,这数据里含有好几个"\0",我现在想要在这段数据中找到我想要的字符串,请问如何实现啊?
[解决办法]
find(str.begin(), str.end(), "ssss");//ssss为要找的字符串
[解决办法]
直接将char赋值给string类型的就可以了
[解决办法]
不可以,find函数只能返回一个找到的第一个的迭代器,如果找不到,就只想指向最后一个元素的下一个位置的迭代器
c风格的字符串可以直接赋值给c++风格的字符串,string会转换它。
C++风格的字符串调用c_str()可以返回一个c风格字符串
[解决办法]
如果你保证最后是\0\0

#include <stdio.h>
#include <string.h>
char s[]="1\00012\000123\0";
char f[]="123";
int myfind(char* ss,char* ff) {
char *p;
p=ss;
while (1) {
if (p[0]==0) return 0;
if (0==strcmp(p,ff)) return 1;
p+=strlen(p)+1;
}
}
int main() {
printf("%d==myfind(s,f);\n",myfind(s,f));
return 0;
}
//1==myfind(s,f);

[解决办法]

这是我自己写的寻找字节特征码,不管是有没有0字符号,都可以寻找到,把你的数据copy到无符号字符数组中

再把你要寻找的字符串,也用无符号数组表示,

寻找模式 offset=FindCodeMe(data,data_len,ss,ss_len,base)
data,是你的数据,data_len,是你的数据长度,字节计算,ss是你准备寻找的字串数组,ss_len是你寻找的字串长度,base基准位置,如果从头开始,就用0


int FindCodeMe(const unsigned char *data,int data_len,const unsigned char *pbyte,int pbyte_len,int offset)
{
bool ok=false;
int i,j;
for( i=offset;i<=data_len-pbyte_len;i++)
{
if(data[i]==pbyte[0]&&data[i+pbyte_len-1]==pbyte[pbyte_len-1])
{
for(j=1;j<pbyte_len-1;j++)
{
if(pbyte[j]!=0x3f &&pbyte[j]!=data[i+j])break;
}
if(j==pbyte_len-1){ok=true;break;}
}
}
if(ok)
return i;
else
return -1;

}
[解决办法]

#include<iostream>
#include <algorithm>
using namespace std;

int main() {
char str[] = {'h','e','l','l','o','\0','b','i','g','w','o','r','l','d'};
char substr[] = "big";
char * p = search(str, str + sizeof(str), substr, substr+strlen(substr));
if(p != str + sizeof(str)){
cout << "find" << endl;
} else {
cout << "not find" << endl;
}
return 0;
}


[解决办法]

/**
* @file memstr.c
* @brief
*/

#include <stdio.h>
#include <string.h>

const char *memstr(const void *b, const char *s, size_t n)


{
const char *ptr, *ret, *end;
size_t len;

len = n;
ret = NULL;
ptr = (const char *)b;
while (len > 0) {
if ((ret = strstr(ptr, s)) != NULL) {
#if 0
return ret;
#else
printf("ret=%s\n", ret);
#endif
}
if ((end = memchr(ptr, '\0', len)) == NULL) {
return NULL;
}
len -= end - ptr + 1;
ptr = end + 1;
}

return NULL;
}

int main(int argc, char *argv[])
{
char b[] = "abc\0def\0ghi\0ab";
const char *ret;


if ((ret = memstr(b, "ab", sizeof(b))) != NULL)
printf("%s\n", ret);

#if 0
#else
return 0;
#endif

if ((ret = memstr(b, "de", sizeof(b))) != NULL)
printf("%s\n", ret);

if ((ret = memstr(b, "gh", sizeof(b))) != NULL)
printf("%s\n", ret);

if ((ret = memstr(b, "bc", sizeof(b))) != NULL)
printf("%s\n", ret);

if ((ret = memstr(b, "hi", sizeof(b))) != NULL)
printf("%s\n", ret);

if ((ret = memstr(b, "ac", sizeof(b))) != NULL)
printf("%s\n", ret);

return 0;
}

读书人网 >C++

热点推荐