C99: Существование strrpbrk (обратный strpbrk) - PullRequest
2 голосов
/ 14 декабря 2010

Я почти уверен, что в C99 нет реверса strpbrk(). Но:

  1. Есть ли причина для этого? Я имею в виду, почему strchr() имеет strrchr(), а strpbrk() не имеет strrpbrk()?

  2. Как получить последнее вхождение в строке любого из символов в другой строке?

Ответы [ 3 ]

1 голос
/ 14 декабря 2010
  1. По моему мнению, поскольку никто не мыслит нестандартно, stpcpy также не является частью C99: (

  2. Посмотрите на реализацию glibc stpbrk, чтобы получить вдохновение, это не так сложно

    /* Find the first occurrence in S of any character in ACCEPT.  */
    char *
    strpbrk (s, accept)
         const char *s;
         const char *accept;
    {
      while (*s != '\0')
        {
          const char *a = accept;
          while (*a != '\0')
            if (*a++ == *s)
              return (char *) s;
          ++s;
        }
      return NULL;
    }
    
0 голосов
/ 24 февраля 2012

Что касается того, как сделать strrpbrk, я полагаю, лучше всего повторить strrchr () для каждого символа во втором параметре и сохранить запись самого высокого указателя.

Что касается определения функции strpbrk, я бы хотел, чтобы разработчики Standardбыли более точными.Должно быть два варианта этой функции - один, который ищет один символ за раз из параметра 2 и возвращает первое найденное совпадение (вариант glibc), и другой, который возвращает самый первый из возможных символов в строке (этот MSVC кажетсяделать).Но я думаю, что мир даже не будет идеальным ...

0 голосов
/ 14 декабря 2010

Потому что int lastMatchIdx=strlen(haystack)-strpbrk(strrev(haystack),needles) слишком легко написать? И имеет ту же сложность (хотя и несколько менее эмпирическую производительность)

for(char* h=haystack;(h=strpbrk(h,needles))!=NULL;rightMostMatch=h++); так же просто

...