使用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) 最近我注意到这个函数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::strstr和memmem含有类似优化几乎相同的性能.直到最近,我认为内部std::string::find使用memmem.
问题是:有什么好的理由,为什么std::string::find不使用std::memmem?它在其他实现中有所不同吗?
问题不是:这个功能的最佳实现是什么?如果它比C慢,那么对C++来说真的很难说.如果两个实现都很慢,我就无所谓了.真正伤害的是性能差异.
我有一个字符串,如下所示:
$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()的反向或相反功能是什么呢?
我正在尝试编写一个程序,将用户输入的子字符串与字符串数组进行比较.
#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,这意味着所有的比较都失败了.我不明白为什么,有人可以帮帮我吗?
将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.
我正在尝试实现自己的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
我只是想不出代码.如果我想改变的语句是一个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)
但是如何在交换机中实现相同的目标呢?
例如,如果我的句子是$sent = 'how are you';,如果我搜索$key = 'ho'使用strstr($sent, $key)它将返回,true因为我的句子ho在其中.
我正在寻找的是一种方法,如果我只搜索你是怎么回事,你或者是你.我怎样才能做到这一点?
我知道有一些快速的字符串搜索算法,比如Boyer–Moore和Knuth–Morris–Pratt,它们的复杂度为 O(n+m),而简单的解决方案是 O(n*m)。
那么,最流行的工具链(gcc 和 Visual Studio)的 strstr() 实现是使用这些快速 O(n) 算法,还是使用简单的解决方案?
我有一个由全名组成的向量,第一个和最后一个名字用逗号分隔,这是前几个元素的样子:
> 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上完成