我注意到很多开发人员正在使用strstr和strpos来检查子字符串是否存在.他们中的一个是首选,为什么?
在PHP 5.3中有一个很好的功能,似乎做我想要的:
strstr(input,"\n",true)
Run Code Online (Sandbox Code Playgroud)
不幸的是,服务器运行PHP 5.2.17并且可选的第三个参数strstr
不可用.有没有办法在以前的版本中实现这一点?
我有一个21056字节的文件.
我在C中编写了一个程序,将整个文件读入缓冲区,然后使用多个搜索算法在文件中搜索82个字符的标记.
我已经使用了"精确字符串匹配算法"页面中所有算法的实现.我用过:KMP,BM,TBM和Horspool.然后我使用strstr
并对每一个进行基准测试.
我想知道的是,每次strstr
优于所有其他算法.有时候唯一更快的是BM.
不strstr
应该是最慢的?
这是我的基准代码,其中包含基准测试BM的示例:
double get_time()
{
LARGE_INTEGER t, f;
QueryPerformanceCounter(&t);
QueryPerformanceFrequency(&f);
return (double)t.QuadPart/(double)f.QuadPart;
}
Run Code Online (Sandbox Code Playgroud)
before = get_time();
BM(token, strlen(token), buffer, len);
after = get_time();
printf("Time: %f\n\n", after - before);
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么strstr
表现优于其他搜索算法吗?如果需要,我会根据请求发布更多代码.
我在旧的遗留代码库中偶然发现了strstr的问题.有很多代码,但基本上测试用例将归结为:
$value = 2660;
$link = 'affiliateid=1449&zoneid=6011&placement_id=11736&publisher_id=1449&period_preset=yesterday&period_start=2017-03-27&period_end=2017-03-27';
var_dump(strstr($link, $value));
Run Code Online (Sandbox Code Playgroud)
我希望这会返回,false
因为"2660"不在字符串中,但它返回d=1449&zoneid=6011&placement_id=11736&publisher_id=1449&period_preset=yesterday&period_start=2017-03-27&period_end=2017-03-27
.
我意识到这$value
应该是一个字符串,但我仍然不明白为什么它没有被PHP转换成字符串,为什么它在链接中找到这个数字.
实际上,如果我尝试使用$value = '2660';
它会false
按预期返回.
知道发生了什么事吗?
我的C程序有很多strstr函数调用.标准库strstr已经很快但在我的情况下搜索字符串总是长度为5个字符.我用特殊版本替换它以获得一些速度:
int strstr5(const char *cs, const char *ct) { while (cs[4]) { if (cs[0] == ct[0] && cs[1] == ct[1] && cs[2] == ct[2] && cs[3] == ct[3] && cs[4] == ct[4]) return 1; cs++; } return 0; }
该函数返回一个整数,因为它足以知道ct中是否出现ct.在这种特殊情况下,我的功能比标准的strstr简单快捷,但我很想知道是否有人可以应用一些性能改进.即使是小改进也是受欢迎的
摘要:
编辑:感谢您的所有答案和评论.我必须研究和测试想法,看看什么是最好的.我将从MAK关于后缀trie的想法开始.
是否有一个版本的strstr在固定长度的内存上工作,可能包含空字符?
我可以像这样说出我的问题:strncpy是memcpy,因为strstr是?
在jQuery或JavaScript中是否有与strstr()
PHP 相同的功能?
我有一个AJAX响应应该是1,2,3,12,13,23或123.我想检查1是否存在,然后如果2存在则则存在3.
我试图将strnstr函数实现为C(strstr,但它会检查长度),由于某种原因它不起作用(输出始终为no):
#include <stdio.h>
char *searchingFor = "stackdummy";
char *in = "la da\ndoo a da\nnow here comes the stack\nok there it was.\n";
char *strnstr(char *s1, char *s2, int length) {
if(s1 == NULL || s2 == NULL) return NULL;
printf("searching \n\n\"%s\"\n for %.*s\n", s1, length, s2);
char *ss1 = malloc(strlen(s1) + 1);
strcpy(ss1, s1);
char *ss2 = malloc(length + 1);
strncpy(ss2, s2, length);
char *result = strstr(ss1, ss2);
free(ss1);
free(ss2);
return result;
}
int main(void) {
printf("found: %s\n", strnstr(in, searchingFor, 5) …
Run Code Online (Sandbox Code Playgroud) 我有一个房地产列表数据库,需要返回一个社区列表.现在我正在使用mysql DISTINCT,它返回所有不同的值.我的疑问是,有很多社区有相似的名字:例如:
Park View Sub 1
Park View
Park View Sub 2
Park View Sub 3
Great Lake Sub 1
Great Lake Sub 2
Great Lake
Great Lake Sub 3
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个简单的php或mysql解决方案,它会认识到"Park View"和"Great Lake"已经存在并且只返回"Park View"和"Great Lake".
我最初的想法是一些如何按长度获得排序顺序,以便短值在顶部,然后循环使用strstr.这听起来像一个大任务,我想知道是否有一个功能,无论是在mysql还是php,都可以很容易地做到这一点.
这是一个接受的程序:
如何找到句子中输入单词的位置?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char sntnc[50], word[50], *ptr[50];
int pos;
puts("\nEnter a sentence");
gets(sntnc);
fflush(stdin);
puts("\nEnter a word");
gets(word);
fflush(stdin);
ptr=strstr(sntnc,word);
//how do I find out at what position the word occurs in the sentence?
//Following is the required output
printf("The word starts at position #%d", pos);
return 0;
}
Run Code Online (Sandbox Code Playgroud)