>第 25 章 C标准库>字符串操作函数>搜索字符串

曹帅军 caoshuaijun@gmail.com
2009-07-28 12:20:23

个人认为:
strrchr()名字中的‘r’应该是单词“reverse”的缩写,是反向的意思。
C++标准库中,迭代器的begin()方法通常有对应的rbegin()方法,其中的‘r’就是“reverse”的意思。


宋劲杉 songjinshan@akaedu.org
2009-07-28 16:02:27

我在网上查了一下,的确支持你这种说法的证据更多一些。谢谢指出!


王兆宏 zhao_hong_wang@sina.com
2009-08-15 10:41:50

char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);

这两个函数的原型应该是下面的吧:
char *strchr(const char *s, char c);
char *strrchr(const char *s, char c);


宋劲杉 songjinshan@akaedu.org
2009-08-15 12:08:41

你man一下。不要想当然。


况海斌 khb.hnu@gmail.com
2009-09-05 16:51:30

strrstr与strchr类似,但是从右向左找字符c,找到字符c第一次出现的位置就返回.

随便查看了以下三个库的源文件:
glibc-2.10
newlib-1.17
gdb
不是从右向左找字符;
同样是从左像右找字符,只是存储中间数据,找到最后一个出现字符c的万恶位置。

贴一下glibc-2.10的源码:
/* Find the last occurrence of C in S.  */
char *
strrchr (const char *s, int c)
{
  register const char *found, *p;

  c = (unsigned char) c;

  /* Since strchr is fast, we use it rather than the obvious loop.  */

  if (c == '\0')
    return strchr (s, '\0');

  found = NULL;
  while ((p = strchr (s, c)) != NULL)
    {
      found = p;
      s = p + 1;
    }

  return (char *) found;
}


宋劲杉 songjinshan@gmail.com
2009-09-24 22:14:41

不错,如果从右往左找,首先要找一遍\0,然后再找字符c,而这样只需找一遍就行了。


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!