Что означает strpbrk?
Я иногда использовал strpbrk()
, когда выполнял низкоуровневую строчную работу на C, но я никогда не мог понять что он означает. Я всегда произносил это внутренне в моей голове как "шевелить р-лайку", но это никогда не чувствовалось правильно.
Он не имеет этимологии, столь же очевидной, как любая из других строковых функций, например. strchr
(str ing ch a r) или strspn
( str ing sp а п).
Я смутно вспоминаю, что где-то читал, что все исходные стандартные библиотечные функции были ограничены 7-символьными именами, чтобы оставаться совместимыми с Fortran, или потому, что в исходном стандарте C идентификаторы длиной более 7 символов считались эквивалентными их 7- символьный префикс или что-то еще. Может ли кто-нибудь подтвердить/опровергнуть/разъяснить это?
Ответы
Ответ 1
В следующем разговоре предлагается "String Pointer Break":
http://www.cpptalk.net/what-strspn-and-strpbrk-stands-for--vt1253.html
Действительно, дело Microsoft в отношении документации - это StrPBrk и, как правило, подтверждает, что разделение слов:
http://msdn.microsoft.com/en-us/library/bb760010(VS.85).aspx
И, наконец, это подтверждает:
http://www.gnu.org/software/libtool/manual/libc/Search-Functions.html
Функция strpbrk ( "string pointer break" ) связана с strcspn, за исключением того, что возвращает указатель на первый символ в строке, который является членом набора stopset, а не длины исходной подстроки. Он возвращает нулевой указатель, если не обнаружен такой символ от остановки.
Ответ 2
Из документации библиотеки GNU C:
Функция: char * strpbrk (const char* string, const char * stopset)
strpbrk ( "прерывание указателя строки" ) функция связана с strcspn, кроме что он возвращает указатель на первый символ в строке, являющейся членом от установленной остановки, а не длина начальной подстроки. Это возвращает нулевой указатель, если такой символ от остановки.
Например,
strpbrk ( "hello, world", "\ t\n,.;!?" ) = > ", world"
Функция возвращает указатель на первый символ в STOPSET (aka BREAKSET). Я мысленно прочитал его как "для STR ing, верните P на BR ea K".
Ответ 3
Что касается вашего другого вопроса:
Я смутно помню, как читал где-то что все оригинальные стандарты библиотечные функции были ограничены 7-символьные имена либо остаться совместимый с Fortran, или потому, что в исходный стандарт C, идентификаторы более 7 символов были считаются эквивалентными их 7-символьный префикс или что-то еще. Можно кто-нибудь подтверждает/отрицает/разъясняет это?
В оригинальном стандарте ANSI C указано, что реализация была определена, сколько символов внешнего символа было бы значительным, но должно быть не менее 6 символов (и для реализации было разрешено быть нечувствительным к делу для них). Это было сделано, потому что путь назад, когда системы часто имели такой тип ограничений (будь то из библиотек FORTRAN, ограничений линкера или чего-то еще).
Итак, пока вы увидите внешние имена дольше, чем в стандартной библиотеке, ни одно из этих имен не начинается с той же последовательности символов из 6 символов.
FWIW, C99 нанесли минимум до 31 символа. В стандарте С++ (1998) говорится, что реализация должна документировать, насколько значительная часть внешнего имени значительна и предполагает, что оно должно быть не менее 1024 символов. Я знаю, что Borland С++ 5.5 имел ограничение примерно на 250 символов, что вызывает проблемы, особенно при использовании шаблонов.
Ответ 4
Я vageuly помню, что strpbrk означает String Pointer Break, я не помню, где я его видел.
Ответ 5
В 1972 году в Bell Labs был также язык программирования Snobol, который был предназначен для манипулирования строкой. У него были функции break() и span(), которые по сути дела сделали одно и то же. Большинство строковых функций моделируются после того, что появилось в Snobol. Проверьте биографические данные и книги, написанные доктором Джеймсом Ф. Гимпелем
Ответ 6
Пока все просто цитируют материал, они не объяснили, почему это "STRING Pointer BReaK". Вы сможете легко запомнить и понять, почему strpbrk, когда вы думаете об этом в темах базового алгоритма, как это:
При сканировании STRING BREAK, если найден какой-либо из символов в POINTER.