这是奇数问题的一些。

我写了一个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()

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top