作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试在 C 中实现一个 strnstr 函数(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) ? "yes" : "no");
printf("found: %s\n", strnstr(in, searchingFor, 5) ? "yes" : "no");
printf("found: %s\n", strnstr(in, searchingFor, 5) ? "yes" : "no");
return 0;
}
最佳答案
Chris Dodd 提供的实现有以下缺点:
strnstr
的目的,因为 while
条件使用了无限字符串函数 strchr
haystack
以 NULL 终止,这与 strnstr
的通常实现有偏差,例如 GNU-Darwin 提供的strchar
未内联时,对 strchr
的调用是不必要的函数调用len
为零时,返回 haystack
而不是 NULL
,这是与接受的 strstr
语义的偏差<needle
的长度为零时,返回一个空字符串而不是 haystack
以下实现解决了上述问题,而不会像 GNU-Darwin 实现那样难以阅读,并且已获得知识共享许可:
#include <string.h>
char *strnstr(const char *haystack, const char *needle, size_t len)
{
int i;
size_t needle_len;
if (0 == (needle_len = strnlen(needle, len)))
return (char *)haystack;
for (i=0; i<=(int)(len-needle_len); i++)
{
if ((haystack[0] == needle[0]) &&
(0 == strncmp(haystack, needle, needle_len)))
return (char *)haystack;
haystack++;
}
return NULL;
}
关于c - 实现strnstr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23999797/
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我正在安装 cminpack 1.1.2 在全新安装的 Ubuntu 10.10 上。 运行时 sudo make在 cminpack 文件夹中,在 52% 处出现以下错误: [ 52%] Build
我是一名优秀的程序员,十分优秀!