Что такое код strrchr


Содержание

Что такое код strrchr

(PHP 3, PHP 4, PHP 5)

strrchr — Находит последнее вхождение подстроки

Описание string strrchr ( string haystack, char needle )

Возвращает подстроку строки haystack начиная с последнего вхождения needle до конца строки.

Если подстрока needle не найдена, возвращает FALSE .

Если needle не является строкой, он приводится к целому и трактуется как код символа.

Пример 1. Пример использования strrchr()

// получить последнюю директорию из $PATH
$dir = substr ( strrchr ( $PATH , «:» ), 1 );

// получить все после последнего перевода строки
$text = «Line 1\nLine 2\nLine 3» ;
$last = substr ( strrchr ( $text , 10 ), 1 );
?>

С версии PHP 4.3.0 strrchr() безопасна для обработки данных в двоичной форме.

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

Ищет последнее вхождение символа в строке. Scans a string for the last occurrence of a character.

Функции _mbsrchr и _mbsrchr_l не могут использоваться в приложениях, запускаемых в среде выполнения Windows. _mbsrchr and _mbsrchr_l cannot be used in applications that execute in the Windows Runtime. Дополнительные сведения: Функции CRT, которые не поддерживаются в приложениях универсальной платформы Windows. For more information, see CRT functions not supported in Universal Windows Platform apps.

Синтаксис Syntax

Параметры Parameters

str str
Строка для поиска, завершающаяся символом NULL. Null-terminated string to search.

c c
Символ, который требуется найти. Character to be located.

locale locale
Используемый языковой стандарт. Locale to use.

Возвращаемое значение Return Value

Возвращает указатель на последнее вхождение c в strили значение null, если c не найден. Returns a pointer to the last occurrence of c in str, or NULL if c is not found.

Примечания Remarks

Функция находит последнее вхождение c (преобразованное в char) в str. strrchr The strrchr function finds the last occurrence of c (converted to char) in str. Поиск включает завершающие нуль-символы. The search includes the terminating null character.

Функции wcsrchr и _mbsrchr are wide-character и multibyte-character versions of strrchr для расширенных и многобайтовых символов. wcsrchr and _mbsrchr are wide-character and multibyte-character versions of strrchr . Аргументы и возвращаемое значение wcsrchr представляют собой двухбайтовые строки; аргументы и возвращаемое значение _mbsrchr представляют собой многобайтовые строки. The arguments and return value of wcsrchr are wide-character strings; those of _mbsrchr are multibyte-character strings.

В C эти функции принимают указатель const для первого аргумента. In C, these functions take a const pointer for the first argument. В языке C++ доступны две перегрузки. In C++, two overloads are available. Перегрузка, принимающая указатель на const , возвращает указатель на константу; версия, принимающая указатель на non-const , возвращает указатель нанеконстантный. The overload taking a pointer to const returns a pointer to const; the version that takes a pointer to non-const returns a pointer to non-const. Макрос _CRT_CONST_CORRECT_OVERLOADS определяется, если доступны и константные , инеконстантные версии этих функций. The macro _CRT_CONST_CORRECT_OVERLOADS is defined if both the const and non-const versions of these functions are available. Если требуется поведение, не являющеесяконстантой , для C++ обеих перегрузок, определите символ _CONST_RETURN. If you require the non-const behavior for both C++ overloads, define the symbol _CONST_RETURN.

_mbsrchr проверяет свои параметры. _mbsrchr validates its parameters. Если str имеет значение null, вызывается обработчик недопустимых параметров, как описано в разделе Проверка параметров. If str is NULL, the invalid parameter handler is invoked, as described in Parameter Validation. Если выполнение может быть продолжено errno , для задается _mbsrchr значение еинвал и возвращает 0. If execution is allowed to continue, errno is set to EINVAL and _mbsrchr returns 0. Функции strrchr и wcsrchr не проверяют свои параметры. strrchr and wcsrchr do not validate their parameters. В остальном эти три функции ведут себя идентично. These three functions behave identically otherwise.

На выходное значение влияет параметр категории LC_CTYPE языкового стандарта. Дополнительные сведения см. в разделе setlocale. The output value is affected by the setting of the LC_CTYPE category setting of the locale; for more information, see setlocale. Версии этих функций без суффикса _l используют текущий языковой стандарт для данного поведения, зависящего от языкового стандарта; версии с суффиксом _l идентичны, за исключением того, что они используют переданный параметр языкового стандарта. The versions of these functions without the _l suffix use the current locale for this locale-dependent behavior; the versions with the _l suffix are identical except that they use the locale parameter passed in instead. Для получения дополнительной информации см. Locale. For more information, see Locale.

Сопоставления подпрограмм обработки обычного текста Generic-Text Routine Mappings

Подпрограмма TCHAR.H TCHAR.H routine _UNICODE и _MBCS не определены _UNICODE & _MBCS not defined _MBCS определено _MBCS defined _UNICODE определено _UNICODE defined
_tcsrchr strrchr _mbsrchr wcsrchr
Н/Д n/a Н/Д n/a _mbsrchr_l Н/Д n/a

Требования Requirements

Подпрограмма Routine Обязательный заголовок Required header
strrchr
wcsrchr или or
_mbsrchr , _mbsrchr_l _mbsrchr , _mbsrchr_l

Дополнительные сведения о совместимости см. в статье Совместимость. For more information about compatibility, see Compatibility.

Пример Example

Пример использования strrchr см. в разделе strchr. For an example of using strrchr , see strchr.

strrchr — Находит последнее вхождение символа в строке

(PHP 4, PHP 5, PHP 7)

strrchr — Находит последнее вхождение символа в строке

Описание

Возвращает подстроку строки haystack начиная с последнего вхождения needle до конца строки.

Список параметров

Строка, в которой производится поиск

Если needle состоит более чем из одного символа, используется только первый символ. Это поведение отличается от strstr() .

Если needle не является строкой, он приводится к целому и трактуется как код символа.

Возвращаемые значения

Функция возвращает фрагмент строки, или FALSE , если подстрока needle не найдена.

Список изменений

Версия Описание
4.3.0 Эта функция теперь бинарно-безопасна.

Примеры

Пример #1 Пример использования strrchr()

// получить последнюю директорию из $PATH
$dir = substr ( strrchr ( $PATH , «:» ), 1 );

// получить все после последнего перевода строки
$text = «Line 1\nLine 2\nLine 3» ;
$last = substr ( strrchr ( $text , 10 ), 1 );
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • strstr() — Находит первое вхождение подстроки
  • strrpos() — Возвращает позицию последнего вхождения подстроки в строке

strrchr

(PHP 4, PHP 5, PHP 7)

strrchr — Находит последнее вхождение символа в строке

Описание

Возвращает подстроку строки haystack , начиная с последнего вхождения needle до конца строки.

Список параметров

Строка, в которой производится поиск

Если needle состоит более чем из одного символа, используется только первый символ. Это поведение отличается от strstr() .

Если параметр needle не является строкой, он преобразуется в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0, и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведен к строке, либо должен быть выполнен явный вызов chr() .

Возвращаемые значения

Функция возвращает фрагмент строки, или FALSE , если подстрока needle не найдена.

Примеры

Пример #1 Пример использования strrchr()

// получить последнюю директорию из $PATH
$dir = substr ( strrchr ( $PATH , «:» ), 1 );

// получить все после последнего перевода строки
$text = «Line 1\nLine 2\nLine 3» ;
$last = substr ( strrchr ( $text , 10 ), 1 );
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • strstr() — Находит первое вхождение подстроки
  • strrpos() — Возвращает позицию последнего вхождения подстроки в строке

User Contributed Notes 11 notes

To extract your portion of a string without the actual character you searched for, you can use:

= ‘/www/public_html/index.html’ ;
$filename = substr ( strrchr ( $path , «/» ), 1 );
echo $filename ; // «index.html»
?>

just a small addition to carlos dot lage at gmail dot com note which makes it a bit more useful and flexible:

// return everything up to last instance of needle
// use $trail to include needle chars including and past last needle
function reverse_strrchr ( $haystack , $needle , $trail ) <
return strrpos ( $haystack , $needle ) ? substr ( $haystack , 0 , strrpos ( $haystack , $needle ) + $trail ) : false ;
>
// usage:
$ns = ( reverse_strrchr ( $_SERVER [ «SCRIPT_URI» ], «/» , 0 ));
$ns2 = ( reverse_strrchr ( $_SERVER [ «SCRIPT_URI» ], «/» , 1 ));
echo( $ns . «
» . $ns2 );
?>

to: repley at freemail dot it

the code works very well, but as i was trying to cut script names (e.g.: $_SERVER[«SCRIPT_NAME»] => /index.php, cut the string at «/» and return «index.php») it returned nothing (false). i’ve modified your code and now it works also if the needle is the first char.
— regards from germany

//strxchr(string haystack, string needle [, bool int leftinclusive [, bool int rightinclusive ]])
function strxchr ( $haystack , $needle , $l_inclusive = 0 , $r_inclusive = 0 ) <
if( strrpos ( $haystack , $needle )) <
//Everything before last $needle in $haystack.
$left = substr ( $haystack , 0 , strrpos ( $haystack , $needle ) + $l_inclusive );

//Switch value of $r_inclusive from 0 to 1 and viceversa.
$r_inclusive = ( $r_inclusive == 0 ) ? 1 : 0 ;

//Everything after last $needle in $haystack.
$right = substr ( strrchr ( $haystack , $needle ), $r_inclusive );

//Return $left and $right into an array.
return array( $left , $right );
> else <
if( strrchr ( $haystack , $needle )) return array( » , substr ( strrchr ( $haystack , $needle ), $r_inclusive ));
else return false ;
>
>
?>

Забытые секреты кодинга №2: строковые операции в C

«…Я обнаружил, что понимание указателей в С — это не навык, а способность. При поступлении на факультет кибернетики набирается человек 200 вундеркиндов, писавших игрушки для Atari 800 на BASIC в возрасте 4 лет. Затем они весело проводят время, изучая Паскаль, но в один прекрасный день профессор заводит речь об указателях, и внезапно они не могут этого понять… 90% потока переходит на политехнический и становится отличниками, уверяя друзей, что на информатике мало девок. На самом же деле по неизвестной причине часть человечества просто рождается без той части мозга, которая понимает указатели».

Не знаю, есть ли в коре головного мозга зона, отвечающая за понимание указателей ;-). Но сегодня я расскажу тебе о том, как работают строки в Си, и о том, как ускорить их работу. Надеюсь, что будет понятно всем.

ВОПРОСЫ ПО СТАНДАРТНЫМ ФУНКЦИЯМ

Зачем нужны специальные функции для сравнения или копирования строк? Почему в Си не пользуются обычными операторами , +, =, как в других языках?
Да, Си работает со строками совсем по-другому. Строка в Си — это указатель на символ (char). В какой-то области памяти находятся символы строки, заканчивающиеся нулевым символом ‘\0’ — на рисунке это массив символов mom. Адрес этого массива можно передавать в строковые функции, можно извлекать из массива отдельные символы (например, mom[3] — четвертый символ) — словом, это обычная строка.

В другой части памяти может находиться указатель — переменная p, которая хранит адрес определенной части строки. Все операции со строками выполняются через указатели. Например, чтобы найти первую букву ‘А’, нужно вызвать функцию strchr(), которая вернет указатель на этот символ:

p = strchr(s, ‘А’); // p будет указывать на первый символ ‘А’ в строке s

Указатели можно увеличивать и сравнивать. Например, чтобы найти следующую за ‘А’ букву, прибавим к указателю (адресу!) единицу:

p = strchr(s, ‘А’) + 1;

Если нужно узнать, какая буква расположена ближе к началу строки, ‘А’ или ‘М’, сравним указатели:

if( strchr(s, ‘А’) char str[200] = «сто»;
strcat(str, «лица»);
if(str == «столица»)
printf(«Равны!»);

Ошибка заключается в том, что str и «столица» хотя и равны, но расположены в разных участках памяти. Поэтому указатели на них не равны. В этом примере строки будут расположены в памяти примерно так:

Чтобы сравнить «содержимое» строк, нужно вызвать функцию strcmp(). Обрати внимание, что эта функция возвращает 0, когда строки равны:

char str[200] = «сто»;
strcat(str, «лица»);
if(strcmp(str, «столица») == 0)
printf(«Равны!»);

Можно ли в C работать со строками как в Паскале или Бэйсике? То есть можно ли складывать строки плюсом, автоматически выделять под них память и все такое?
Да, можно. В MFC есть класс CString, кроме него можно назвать CStr из Snippets, и еще несколько похожих разработок. Но они всегда будут работать медленнее и занимать больше места в exe’шнике, чем обычные функции Си. Обобщенные функции выделения памяти страдают избыточностью, много времени уходит на создание промежуточных строк и бесполезное копирование между ними. Сишные функции strcmp, strchr и так далее не такие уж сложные, и если ты хорошо разберешься в них, твои программы станут быстрее и короче.

Как выделять память под строки и массивы? Прежде всего, память не выделяется автоматически, как в других языках программирования. Тебе придется подсчитать, сколько символов будет занимать строка, и создать массив нужного размера. Если строка выйдет за границы отведенного для нее массива, то возникнет баг, известный как «переполнение буфера». Взломщик может использовать эту ошибку, чтобы запустить свой вредительский exploit. Поэтому нужно проверять размер строк, полученных от юзера. Например, пользователь вводит текст в контрол, а нам нужно записать этот текст большими буквами. Это делается так:

char *s; int size;
size = SendMessage(hWndCtrl, WM_GETTEXTLENGTH, 0, 0) + 1; // Узнаем размер строки
s = (char*) malloc(size); // Выделяем size байт под строку
SendMessage(hWndCtrl, WM_GETTEXT, size, (LPARAM)s); // Копируем в этот буфер строку
CharUpper(s); // Меняем регистр
SendMessage(hWndCtrl, WM_SETTEXT, 0, (LPARAM)s); // Записываем в контрол
free(s); // Освобождаем память

Выделяя память, нужно помнить о последнем нулевом символе. Он также входит в массив, так что если длина строки — 10 символов, то нужно создавать массив длиной 11 байт. Вместо сишных функций malloc, free в C++ используют операторы new, delete. Разница только в синтаксисе, а по сути это одно и то же:

char *s; int size;
s = new char[size]; // Выделяем size байт под строку
. // Выполняем нужные операции
delete[] s; // Освобождаем память

Часто максимальный размер строки известен заранее. Например, путь к файлу в Windows не может быть длиннее MAX_PATH = 260 символов. Тогда проще ограничить длину вводимой строки (послать сообщение EM_SETLIMITTEXT), а затем использовать обычный статический массив:

Функции malloc/realloc/free и операторы new/delete обращаются к Windows, запрашивая у нее память. Если вместо них ты будешь пользоваться Windows’овскими функциями HeapAlloc, HeapRealloc, HeapFree, то сможешь выбросить из exe’шника стандартную библиотеку Си, и он станет короче примерно на 20 Кб. А код для выделения памяти будет очень похожим на
malloc/free:

HANDLE heap;
heap = GetProcessHeap(); // в начале программы
s = (char*) HeapAlloc(heap, 0, size); // Выделяем size байт под строку
HeapFree(heap, 0, s); // Освобождаем память

ПРОСТЫЕ ОПЕРАЦИИ СО СТРОКАМИ

Как выделить подстроку справа, например, имя файла? Просто найди символ, с которого начинается подстрока, и пользуйся указателем на него. На рисунке указатель filename показывает на строку «C:\WORK\FV.C», а указатель p — на часть этой строки «FV.C».

p = strrchr(filename, ‘\\’) + 1; // Символ, следующий за последней обратной косой чертой

Как выделить подстроку слева, например, путь к файлу? Подставь нулевой байт в конец подстроки:

p = strrchr(filename, ‘\\’);
*p = ‘\0’; // Теперь в filename записан путь к файлу

Чтобы вернуть имя файла, верни косую черту на прежнее место. Это гораздо быстрее, чем копировать путь в отдельную строку.

Как подсчитать, сколько раз символ встречается в строке? Можно каждый раз искать этот символ в оставшейся части строки и, если он был найден, увеличивать счетчик и сдвигаться к концу строки:

char *p = str; int n = 0;
while(p = strchr(p, ‘А’))
p++, n++; // По окончании цикла n == число вхождений символа ‘А’ в строку str

В более удобочитаемом виде та же программа записывается следующим образом:

Почему указатели быстрее, чем индексы массивов? Программеров, которые пришли из Паскаля или Бэйсика, может немного смутить код, приведенный выше. Для них привычнее обращаться к символу строки по индексу (его номеру в квадратных скобках):

Чем лучше указатели? Да тем, что процессору не нужно при каждом проходе цикла складывать адрес начала строки s и переменную i, чтобы вычислить адрес
s[i]:


xor ecx, ecx ; ecx — это i
xor edx, edx ; edx — это n
LOOP:
cmp DWORD PTR s[ecx], ‘A’
jne SHORT BYPASS
inc edx
BYPASS:
inc ecx
cmp ecx, eax
jb SHORT LOOP

Вместо этого хорошая программа просто увеличивает адрес, то есть указатель p, а не индекс i. Код тела цикла становится немного проще и быстрее:

mov ecx, offset s ; ecx — это p
xor edx, edx ; edx — это n
LOOP:
cmp BYTE PTR [ecx], ‘A’
jne SHORT BYPASS
inc edx
BYPASS:
inc ecx
cmp ecx, eax
jb SHORT LOOP

Здесь нужно сказать, что интеллектуальный компилятор может «додуматься» преобразовать код с индексом в код с указателем, но слишком надеяться на это не стоит. Компилятор все же не так умен, как использующий его программист :).

Как найти первую гласную или согласную букву в строке? Для этого случая лучше всего подходят функции strpbrk() и
strspn().

p = strpbrk(«стройка», «аеёиоуыэюя»); //
p – указатель на первую гласную
p = s + strspn(s, «аеёиоуыэюя»); // p – указатель на первую согласную

ПРОБЛЕМЫ С РУССКИМ ЯЗЫКОМ

Как преобразовать русские буквы в верхний или нижний регистр? Лучше всего использовать функции CharUpper() и CharLower() из библиотеки Windows (заголовочный файл windows.h). Во-первых, эти функции учитывают язык, установленный в Панели управления Windows, поэтому твоя программа будет работать правильно во всех странах и со всеми языками. Во-вторых, проще пользоваться этими функциями, чем пытаться настроить стандартные функции Си для работы с русским или изобретать что-то свое. Пример:

char *m=»министр», *p=»Президент»;
CharUpper(m);
CharLower(p);
printf(«%s %s», m, p); // Выведет «МИНИСТР президент»

Вместо указателя на строку можно передать отдельный символ или воспользоваться функциями с суффиксом -Buff, которые преобразуют указанное число символов строки:

char m[]=»министр»;
m[0] = (char)CharUpper((char*)(unsigned)(unsigned char)m[0]); // Министр
CharUpperBuff(m+2, 3); // МиНИСтр

Глядя на этот кусок кода, знатоки Си могут употребить немало интересных слов великого и могучего русского языка :). Но я пока не нашел другого работающего способа преобразовать тип (char) в (char*). Если кто-то найдет — пишите. Кстати, во многом это проблема программистов Microsoft. Им нужно было написать отдельное определение (макрос или inline-функцию) для CharUpper с аргументом типа
char.

В сравнении строк есть и еще одна тонкость, на которую обычно не обращают внимания. Дело в том, что коды символов не всегда соответствуют их порядку в алфавите. Например, русская буква «Ё» и специфические белорусские буквы «Ў» («у» краткое), «ї» («и» десятеричное) расположены в кодовой таблице Windows отдельно от всех остальных букв. И если ты сравниваешь слова «дерево» и «ёлка» с помощью strcmp (сравнение по кодам), то получишь, что «ёлка» меньше (ближе к началу алфавита), чем «дерево». Чтобы избежать этой ошибки, пользуйся функцией lstrcmp() из библиотеки Windows. Для примера приведу простейшую программу пузырьковой сортировки:

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
< char *a[]=<"кедр","дуб","желудь","дерево","ёлка","сосна">;
char *p, *x; unsigned i, j; char s[200];
#define N sizeof(a)/sizeof(a[0])
for(i=0; i Пузырьковая сортировка, strcmp
for(j=i+1; j 0 )
< x = a[i];
a[i] = a[j];
a[j] = x;
>
p = s;
p += sprintf(p, » strcmp:\n»);
for(i=0; i Пузырьковая сортировка, lstrcmp
for(j=i+1; j 0 )
< x = a[i];
a[i] = a[j];
a[j] = x;
>
p += sprintf(p, «\n lstrcmp:\n»);
for(i=0; i

Эта программа выведет (видно, что сортировка с использованием strcmp неверно обрабатывает слово «ёлка»):

strcmp:
ёлка
дерево
дуб
желудь
кедр
сосна

lstrcmp:
дерево
дуб
ёлка
желудь
кедр
сосна

УБРАТЬ И УДВОИТЬ

Как убрать из строки определенные символы, например, все пробелы и знаки препинания? Есть очень простой способ. Заведем два указателя: один (p) на ту часть строки, которую мы просматриваем, другой (p2) — на ту часть, в которую мы будем копировать символы, не являющиеся пробелами или знаками препинания. Если нам встретился знак препинания, пропускаем его, увеличивая только первый указатель. Таким образом, мы «собираем» все символы к началу строки (см. рисунок ниже).

char s[256], *p = s, *p2 = s;
gets(s);
while(*p) // Пока в строке есть символы
< if( !ispunct(*p) && !isspace(*p) )
*(p2++) = *p; // Если не знак препинания, копируем
p++; // Переходим к следующему символу
>
*p2 = ‘\0’;
puts(s);

Кстати, в Visual C++ функции ispunct, isspace довольно медленные, поэтому вместо них лучше написать условие типа

‘ ) //
примерно на 10% быстрее, чем !ispunct(p) &&
!isspace(*p)

Как убрать из строки все вхождения подстроки, например, убрать все переносы строк? Точно также, как и в случае с удалением символа, будем копировать нужные нам части строки в её начало. Можно искать подстроку с помощью strstr() или применить описанный в первой части статьи «Забытые секреты кодинга» макрос
toShort:

Что такое код strrchr

Функция strrchr() возвращает указатель на местонахождение последнего совпадения с символом c в строке s.

Функция strchrnul() подобна strchr(), за исключением того, что если символ c не найден в строке s, то возвращается указатель на байт null в конце s, а не NULL.

Здесь под «символом» подразумевается «байт» — данные функции не работают с широкими и многобайтными символами.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функция strchrnul() возвращает указатель на совпавший символ, или указатель на байт null в конце строки s (т.е., s+strlen(s)), если символ не найден.

ВЕРСИИ

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
strchr(), strrchr(), strchrnul() безвредность в нитях безвредно (MT-Safe)

СООТВЕТСТВИЕ СТАНДАРТАМ

Функция strchrnul() является расширением GNU.

Понимание функции strrchr

Я делаю некоторые тесты с функцией strrchr, но я не могу понять вывод:

Хорошо, функция вернула строку до последнего вхождения

Но в этом случае, почему функция возвращает «t-код», вместо этого «тестовый код»?

Если игла содержит более одного символа, используется только первый. Такое поведение отличается от strstr().

Итак, ваш первый пример является таким же, как:

РЕЗУЛЬТАТ

Ваш второй пример является таким же, как:

РЕЗУЛЬТАТ

Эта функция, которую я сделал, делает то, что вы ожидали:

Используемое регулярное выражение может быть протестировано здесь: DEMO

Пример:

OUTPUT

Simple! Потому что он находит последнее вхождение символа в строке. Ни слова.

Он просто находит последний символ вхождения, а затем он будет echo остальную часть строки из этой позиции.

В первом примере:

Он находит последний m , а затем печатает reset m : my code

В вашем втором примере:

Он находит последний t и, как и последний пример, печатает остальные: test code

strrchr — Находит последнее вхождение символа в строке

(PHP 4, PHP 5, PHP 7)

strrchr — Находит последнее вхождение символа в строке

Описание

Возвращает подстроку строки haystack начиная с последнего вхождения needle до конца строки.

Список параметров

Строка, в которой производится поиск

Если needle состоит более чем из одного символа, используется только первый символ. Это поведение отличается от strstr() .

Если needle не является строкой, он приводится к целому и трактуется как код символа.

Возвращаемые значения

Функция возвращает фрагмент строки, или FALSE , если подстрока needle не найдена.

Список изменений

Версия Описание
4.3.0 Эта функция теперь бинарно-безопасна.

Примеры

Пример #1 Пример использования strrchr()

// получить последнюю директорию из $PATH
$dir = substr ( strrchr ( $PATH , «:» ), 1 );

// получить все после последнего перевода строки
$text = «Line 1\nLine 2\nLine 3» ;
$last = substr ( strrchr ( $text , 10 ), 1 );
?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • strstr() — Находит первое вхождение подстроки
  • strrpos() — Возвращает позицию последнего вхождения подстроки в строке

Почему strrchr () возвращает `char *` вместо `const char *`?

Функция char* strrchr(const char *str, int ch) возвращает указатель ( char* ) в str ( const char * ) где последнее вхождение ch расположен.

Таким образом, мы можем написать следующий код без приведения:

В чем преимущество возвращения char* вместо const char* ?

РЕДАКТИРОВАТЬ:
Как Шафик Ягмур указал, что есть очень хорошие ответы на Как работает реализация strchr?

Поскольку мой код на C ++, я буду использовать вместо , Спасибо за ваши ответы ��

Тем не менее Ответ Майка Сеймура лучше всего подходит вопрос. Я даже добавил более подробный ответ ниже четко сказать, как strrchr() является функцией C (перегрузка не разрешена), объявление соответствует Const а также неконстантная строки. Так как strrchr() можно вызвать с неконстантная строка, возвращаемая строка также должна быть неконстантная.

Решение

В Си функция должна быть такой, или заставлять пользователя использовать хитрые приведения во многих ситуациях:

  • Если это заняло const указатель, вы не можете найти const строка;
  • Если он вернул const указатель, вы не можете использовать его для изменения const строка.

В C ++ вы должны включить а не устаревший C-only заголовок. Это даст вам две const-правильные перегрузки, которые не могут быть выполнены в C:

Другие решения

Вы смотрите на устаревшую функцию из стандартной библиотеки C ( ). Библиотека C ++ ( ) вводит подходящее const и не const перегрузки , поэтому вы должны использовать это везде, где это возможно.

const char *str средства strrchr гарантирует не изменять str ,

возврате const char * средства strrchr запрещает вам изменять возвращаемое значение.

strrchr() от является функцией C. Поскольку C не разрешает перегрузку функций, strrchr() был разработан, чтобы соответствовать как Const а также неконстантная строки.

strrchr() может быть вызван с неконстантная строка, и поэтому возвращаемая строка также должна быть неконстантная как объяснено в следующих примерах.

Const контекст без ошибки компиляции:

неконстантная контекст без ошибки компиляции:

Неправильное использование также без ошибки компиляции:

В C ++ есть две перегруженные функции :

Const контекст использует 1-й:

неконстантная контекст использует 2-й:

Неправильное использование должно привести к ошибке компиляции:

Но этот последний пример не приводит к ошибке компиляции, используя g++ -Wall file.cpp , Протестировано с использованием версий GCC 4.1.2 (RedHat) а также 4.7.2 (MinGW).

Почему вы запрещаете коду изменять возвращаемую переменную? Имейте в виду, что const char * не является char * const , вам будет разрешено изменить символ в любом случае, но вы не сможете контролировать само возвращаемое значение, что не имеет особого смысла, так как вы можете изменить его и отредактировать базовую строку в другой позиции для твоя цель.

Почему GCC принимает Перекодировку из «сопзЬ символ *» в «символ *» на станде :: strrchr () возвращаемое значение?

При добавлении подробного ответа , я заметил , что НКУ не предупреждают следующий код в то время как Visual C ++ жалуется.

Я проверил три различных GCC версии:

  • 4.1.2 на Red Hat (Linux)
  • 4.5.3 на Cygwin (Windows)
  • 4.7.2 на MinGW (Windows)

Но все эти три версии GCC компилируется этот код без какого-либо предупреждения / ошибки:

В то время как Microsoft компилятор v16 жалуется:

(От моего офиса, я не имею доступа к ideone / codepad / . чтобы проверить его с помощью других версий)

В этом коде используется зЬй :: strrchr , я не понимаю , почему GCC не жалуется.

Мой вопрос: Почему г ++ успешно скомпилировать этот код без предупреждения / ошибок? Является ли это ошибка? особенность? промаха конфигурация на моей стороне?

На самом деле ваш г ++ не принимает преобразование из « const char * » до « char * », это просто , что на вашей версии std::strrchr() возвращает char* (неправильно, вместо const char* ).

Чтобы проверить первую часть моего заявления, попробуйте скомпилировать следующий на ваши версии GCC, я предсказываю, что все правильно выдаст ошибку:

Теперь для второй части я попытался скомпилировать следующий минимальный код, у которого фактической цель состоит в том, чтобы вызвать ошибку , чтобы перечислить декларируемые перегрузки из std::strrchr :

Ну, с GCC 4.7.2 сообщение показывает ожидаемое «все неконстантное» и «все константные» перегруженные:

то есть прототипы

Но с GCC 4.3.2 сообщение было по- другому:

т.е. Перегрузки были

(вторые из них является C ++ Неконстантных перегрузок, но первый старая версия С , и вместо этого должна быть константной перегрузкой C ++).

Это, кажется , что заголовки ( и / или ) были неправильными по этой версии, и я подозреваю , что это то же самое у.

Edit: я нашел, например, обсуждение , в блоге и сообщение об ошибке (для strchr не , strrchr но это та же история).

Илон Маск рекомендует:  Компьютерные сети
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL