gpt4 book ai didi

c - 实现strnstr

转载 作者:太空狗 更新时间:2023-10-29 16:48:25 28 4
gpt4 key购买 nike

我正在尝试在 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 提供的实现有以下缺点:

  1. 它违背了 strnstr 的目的,因为 while 条件使用了无限字符串函数 strchr
  2. 这取决于 haystack 以 NULL 终止,这与 strnstr 的通常实现有偏差,例如 GNU-Darwin 提供的
  3. strchar 未内联时,对 strchr 的调用是不必要的函数调用
  4. len 为零时,返回 haystack 而不是 NULL,这是与接受的 strstr 语义的偏差<
  5. 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com