标签: strstr

如何在包含null的缓冲区中搜索子字符串?

使用C,我需要在缓冲区内找到一个可能包含空值的子字符串.

haystack = "Some text\0\0\0\0 that has embedded nulls".
needle   = "has embedded"r 
Run Code Online (Sandbox Code Playgroud)

我需要返回子串的开头,或者null,similat到strstr():

request_segment_end = mystrstr(request_segment_start, boundary);
Run Code Online (Sandbox Code Playgroud)

您知道的是否存在任何现有实施?

更新

我在google的codesearch上找到了memove的实现,我在这里逐字复制,未经测试,

 /*
 * memmem.c
 *
 * Find a byte string inside a longer byte string
 *
 * This uses the "Not So Naive" algorithm, a very simple but
 * usually effective algorithm, see:
 *
 * http://www-igm.univ-mlv.fr/~lecroq/string/
 */

#include <string.h>

void *memmem(const void *haystack, size_t n, const void *needle, size_t m)
{
        const unsigned char *y = (const unsigned char *)haystack; …
Run Code Online (Sandbox Code Playgroud)

c strstr

6
推荐指数
2
解决办法
6938
查看次数

性能std :: strstr vs. std :: string :: find

可能重复:
C++ string :: find complexity

最近我注意到这个函数std::string::find比函数慢了一个数量级std::strstr- 在我的环境中使用Linux上的GCC 4.7.性能差异取决于字符串的长度和硬件架构.

差异似乎有一个简单的原因:std::string::find基本上是std::memcmp在一个循环中调用- 具有时间复杂性O(m * n).相比之下,std::strstr它针对硬件架构进行了高度优化(例如,使用SSE指令),并使用更复杂的字符串匹配算法(显然是Knuth-Morris-Pratt).

我也很惊讶没有在语言文件中找到这两个功能的时间复杂性(即草稿N3290和N1570).我只发现了时间的复杂性char_traits.但这没有用,因为没有子字符串搜索功能char_traits.

我希望,这std::strstrmemmem含有类似优化几乎相同的性能.直到最近,我认为内部std::string::find使用memmem.

问题是:有什么好的理由,为什么std::string::find不使用std::memmem?它在其他实现中有所不同吗?

问题不是:这个功能的最佳实现是什么?如果它比C慢,那么对C++来说真的很难说.如果两个实现都很慢,我就无所谓了.真正伤害的是性能差异.

c++ gcc stdstring strstr

6
推荐指数
1
解决办法
6698
查看次数

strstr的PHP函数相反返回字符串的第一部分,而不是最后一部分

我有一个字符串,如下所示:

$abcdef(+$1.00)
Run Code Online (Sandbox Code Playgroud)

我试图在第一个括号之前得到字符串的第一部分:

$abcdef
Run Code Online (Sandbox Code Playgroud)

目前,如果我使用strstr()它将返回指定字符后的字符串部分:

$newstr = strstr($var, '(');
Run Code Online (Sandbox Code Playgroud)

我想要在发生之前的部分.strstr()的反向或相反功能是什么呢?

php string strstr

6
推荐指数
1
解决办法
2813
查看次数

strstr()函数

我正在尝试编写一个程序,将用户输入的子字符串与字符串数组进行比较.

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

char animals[][20] = {
    "dogs are cool",
    "frogs are freaky",
    "monkeys are crazy"
};

int main() {
    char input[10];

    puts("Enter animal name: ");
    fgets(input, sizeof(input), stdin);

    int i;
    for(i = 0; i < 3; i++) {
        if(strstr(animals[i], input))
            printf("%s", animals[i]);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我进入青蛙时,例如它应该打印出"青蛙怪异"的信息,但它什么都没打印出来.

所以我试着写一行来每次打印出strstr()函数的值,它们都返回0,这意味着所有的比较都失败了.我不明白为什么,有人可以帮帮我吗?

c substring strstr

6
推荐指数
3
解决办法
2966
查看次数

NULL参数对strstr的行为是什么?

将NULL作为参数传递时的行为是strstr什么?

鉴于:

char * p = NULL;
char * s = NULL;
Run Code Online (Sandbox Code Playgroud)

情况1: strstr(p, "Hello");

案例2: strstr("With my dog", p);

案例3: strstr(p, s);

我的理解是行为未定义,并留给所有3个案例的实施.

根据Microsoft Visual Studio文档,他们执行参数验证并在那里处理它. 请参阅备注部分.

我们在IAR Workbench上使用C99.

背景:一些测试人员正在编写单元测试并为字符串变量分配NULL.

c strstr language-lawyer

6
推荐指数
1
解决办法
6958
查看次数

strcmp实现不使用特殊字符

我正在尝试实现自己的strcmp功能,strcmp当我使用特殊字符时,我的bahaves不同.

#include <string.h>    

int my_strcmp(const char *s1, const char *s2)
{
    const char  *str1;
    const char  *str2;

    str1 = s1;
    str2 = s2;
    while ((*str1 == *str2) && *str1)
    {
        str1++;
        str2++;
    }
    return (*str1 - *str2);
}

int main()
{
   char *src = "a§bcDef";
   char *des = "acbcDef";
   printf("%d %d\n", my_strcmp(des, src), strcmp(des, src));
   return(0);
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT

161-95

c strstr

6
推荐指数
1
解决办法
719
查看次数

在交换机php里面使用strstr

我只是想不出代码.如果我想改变的语句是一个switch语句,我已经太多了,但我找不到逻辑.

目前我有:

if(strstr($var,'texttosearch'))
   echo 'string contains texttosearch';

if(strstr($var,'texttosearch1'))
   echo 'string contains texttosearch1';

if(strstr($var,'texttosearch2'))
   echo 'string contains texttosearc2h';

//etc etc...
Run Code Online (Sandbox Code Playgroud)

但是如何在交换机中实现相同的目标呢?

php switch-statement strstr

5
推荐指数
2
解决办法
7538
查看次数

如何检查句子中是否存在单词

例如,如果我的句子是$sent = 'how are you';,如果我搜索$key = 'ho'使用strstr($sent, $key)它将返回,true因为我的句子ho在其中.

我正在寻找的是一种方法,如果我只搜索你是怎么回事,你或者是你.我怎样才能做到这一点?

php search strstr

5
推荐指数
2
解决办法
1万
查看次数

strstr() 在 gcc 和 VS 中的实现是否具有线性复杂度?

我知道有一些快速的字符串搜索算法,比如Boyer–MooreKnuth–Morris–Pratt,它们的复杂度为 O(n+m),而简单的解决方案是 O(n*m)。

那么,最流行的工具链(gcc 和 Visual Studio)的 strstr() 实现是使用这些快速 O(n) 算法,还是使用简单的解决方案?

c gcc strstr visual-studio

5
推荐指数
1
解决办法
2249
查看次数

将全名矢量拆分为2个单独矢量的有效方法

我有一个由全名组成的向量,第一个和最后一个名字用逗号分隔,这是前几个元素的样子:

> head(val.vec)
[1] "Aabye,? Edgar"        "Aaltonen,? Arvo"      "Aaltonen,? Paavo"    
[4] "Aalvik Grimsb,? Kari" "Aamodt,? Kjetil Andr" "Aamodt,? Ragnhild
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法将它们分成2个单独的名和姓列.我的最终目的是将它们都作为更大数据框架的一部分.

我尝试使用这样的strsplit功能

names<-unlist(strsplit(val.vec,','))
Run Code Online (Sandbox Code Playgroud)

但它给了我一个长向量而不是2个独立的集合,我知道可以使用一个循环并遍历所有元素并将名字和姓氏放在2个单独的向量中,但考虑到这个事实,它有点耗时有大约25000条记录.

我看到了一些类似的问题,但讨论的是如何在C +和Java上完成

string r strstr

5
推荐指数
1
解决办法
1068
查看次数