题
这是奇数问题的一些。
我写了一个C函数。它的 '喜欢',和strchr / strrchr。它应该寻找在C-字符串的字符,而是向后倒退,并返回一个指向它。为c字符串不是“空发起”,它也需要一个第三参数“计数”,表示字符的数目应该向后看。
/*
*s: Position from where to start looking for the desired character.
*c: Character to look for.
*count: Amount of tests to be done
*
* Returns NULL if c is not in (s-count,s)
* Returns a pointer to the occurrence of c in s.
*/
char* b_strchr(const char* s,int c,size_t count){
while (count-->0){
if (*s==c) return s;
s--;
}
return NULL;
}
我做的一些就可以了的测试,但 你看到它的任何缺陷?安全问题或者这样的吗?任何改进?难道改进? 而更重要的:这是一个坏主意。
一些使用情况。
char* string = "1234567890";
printf("c: %c\n",*b_strchr(string+9,'5',10));//prints 5
printf("c: %c\n",*b_strchr(string+6,'1',7));//prints 1
编辑:新接口,一些变化
。/*
* from: Pointer to character where to start going back.
* begin: Pointer to characther where search will end.
*
* Returns NULL if c is not between [begin,from]
* Otherwise, returns pointer to c.
*/
char* b_strchr(const char* begin,int c,const char* from){
while (begin<=from){
if (*from==c) return from;
from--;
}
return NULL;
}
解决方案
这是一个与编辑好,但是界面依然令人惊讶。我把begin
参数(草堆被搜索)作为第一个参数,所述参数c
(在针所搜索)第二和from
参数(开始搜索的位置)第三。该顺序似乎是跨越一个相当大的组API惯用。
其他提示
代码具有深奥的接口 - 传递一个指针到该字符串的最后一个字符和字符串的长度。将使用它导致的问题。
(可替换地,代码有缺陷 - 你应该在循环之前添加计数峰)
如果开始是,当前的代码将始终返回开始,这是不是你想要的。在循环后的代码可以只是返回NULL。而不是开始!=从环情况下,我会用开始<从否则你会当有人混淆了参数的顺序指针运算溢出。
编辑:上第二个想法,因为你想[开始,从]包容应当开始<=从
我写了一个C函数。其 '喜欢' 和strchr / strrchr。
您已经尝试重塑strrchr()
,所以它不是像strchr()
。
你看到任何破绽呢?
是。一些。 : - (
由于b_strchr()
可以返回NULL
,你不应该把它直接进入printf()
声明。 Deferencing NULL
通常导致一个段错误。
您可以与您喜爱的...变化更好
char *result;
result = b_strchr(string + 9, 'a', 10));
if (result == NULL)
{
printf("c: NULL\n");
}
else
{
printf("c: %c\n", *result);
}
此外,当
(count >= length of the input string) and the character is not found
您会得到unpredicable的结果,因为s
不再指向字符串中的字符 - s
是字符串开始前指向的内存。作为一个例子,尝试
result = b_strchr(string + 9, 'a', 11));
if (result == NULL)
{
printf("c: NULL\n");
}
else
{
printf("c: %c\n", *result);
}
和看看会发生什么。
展开您的使用测试案例包括你知道什么会成功在外面工作的条件。请别人帮你设计测试用例,这将真正考验你的代码。
而更重要的:这是一个坏主意。
?
作为一个学习练习,绝对不是。
然而,在这种情况下,用于生产代码你会更好粘到标准strrchr()
。