首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么在一个含有 "\0" 的字符串里查找指定的字符串

2012-12-31 
如何在一个含有\0 的字符串里查找指定的字符串?我用recv从网上接收到一串数据,这数据里含有好几个\0,

如何在一个含有 "\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;
}

热点排行