我想建议以下实现:
// Find an instance of substr in an array of characters
// the array of characters does not have to be null terminated
// the search is limited to the first n characters in the array.
char *strnstr(char *str, const char *substr, size_t n)
{
char *p = str, *pEnd = str+n;
size_t substr_len = strlen(substr);
if(0 == substr_len)
return str; // the empty string is contained everywhere.
pEnd -= (substr_len - 1);
for(;p < pEnd; ++p)
{
if(0 == strncmp(p, substr, substr_len))
return p;
}
return NULL;
}
第一个参数的基本原理不是const,因为您可能希望使用返回值指针来修改该位置的数组。
为了完整性,在C++中,可以添加一个重载的变量,即const:
const char *strnstr(const char *str, const char *substr, size_t n)
{
return strnstr((char *)str, substr, n);
}
有什么评论吗?
正如建议的那样,下面是一个测试程序:
#include <iostream>
#include <cstring>
#include <string>
int main()
{
char s[] = "1234567890abcdefgh";
size_t n = sizeof(s) - 1;
const char *patterns[] = { "efgh", "0ab", "0b", NULL };
const char *result = NULL;
const char *pPattern = patterns[0];
std::cout << "array of length " << n << " is: " << s << std::endl;
for (int i = 0; pPattern; pPattern = patterns[++i])
{
result = strnstr(s, pPattern, n);
std::cout << "finding " << pPattern << " n=" << n << ": "
<< (result ? result : "(null)") << std::endl;
}
pPattern = patterns[0];
result = strnstr(s, pPattern, n-1);
std::cout << "finding " << pPattern << " n=" << n-1 << ": "
<< (result ? result : "(null)") << std::endl;
return 0;
}
输出:
array of length 18 is: 1234567890abcdefgh
finding efgh n=18: efgh
finding 0ab n=18: 0abcdefgh
finding 0b n=18: (null)
finding efgh n=17: (null)
发布于 2016-06-20 23:25:05
str
作为数组并搜索到n
,与类似字符串的函数和strstr()
不一致。与其“搜索仅限于数组中的前n个字符”,我还希望str
中没有搜索空字符后面的字符。海事组织,一个设计缺陷。下面的评论假设str[i] == 0
没有特殊的意义。str
。str
是数组的地址,可能不是字符串。调用潜在的非字符串str
传递错误的想法。建议src
等,在寻找子字符串时,我喜欢needle
和haystack
。str
内容,建议使用const
。“第一个参数的基本原理不是const,因为您可能希望使用返回值指针来修改该位置的数组。”不适用。将返回值强制转换为char *
即可。跟随strstr()
s轮胎。//自C图书馆。//预期签名:(为清晰起见) // C char *strnstr(const char *src,const char *substr,size_t n);// C++ char *strnstr( char *src,const char *substr,size_t n);const char *strnstr(const char *src,const char *substr,size_t n);CP_strnstr()
和可选的#define strnstr CP_strnstr
。str
与if(0 == substr_len) return str;
一起返回时,size == 0
没有意义。我想是NULL
。needle
){返回NULL;} pEnd -= (substr_len -1),则haystack
// add检查的长度可能更长或更短;次要
NULL
char *strnstr(char *str,const *substr,size_t n) { assert(str =n == 0);https://codereview.stackexchange.com/questions/132519
复制相似问题