Подскажите код стандартной функции strrchr - C (СИ)
Формулировка задачи:
Привет, интересует код стандартной функции strrchr в c++
Решение задачи: «Подскажите код стандартной функции strrchr»
textual
Листинг программы
extern void abort (void);
extern int inside_main;
__attribute__ ((__noinline__))
char *
strrchr (const char *s, int c)
{
__SIZE_TYPE__ i;
#ifdef __OPTIMIZE__
if (inside_main)
abort ();
#endif
i = 0;
while (s[i] != 0)
i++;
do
if (s[i] == c)
return (char *) s + i;
while (i-- != 0);
return 0;
}
__attribute__ ((__noinline__))
char *
rindex (const char *s, int c)
{
return strrchr (s, c);
}
Объяснение кода листинга программы
- Вначале объявлены две внешние переменные:
abortиinside_main. Значение переменнойinside_mainне определено, но для правильной работы кода важно, чтобы оно было корректно инициализировано. - Функция
strrchrпринимает два аргумента:s- указатель на строку, в которой нужно найти последний символ, иc- символ, который нужно найти. - Внутри функции используется переменная типа
__SIZE_TYPE__с именемi, которая инициализируется значением 0. - Затем начинается цикл, который проходит по всем символам строки
s. Если текущий символ равен 0, то цикл завершается. - Если внутри цикла встретился символ
c, то функция возвращает указатель на этот символ в строкеs. - Если цикл завершился без возврата из функции, то возвращается 0, что означает, что символ
cне был найден в строке. - Функция
rindexобъявлена как вспомогательная функция, которая просто вызывает функциюstrrchr. - В обоих функциях используется атрибут
__noinline__, который запрещает оптимизацию кода компилятором, что позволяет получить корректный результат при отладке. - В оптимизированном коде, если функция
strrchrвызывается не из функцииmain, то происходит вызов функцииabort, что приводит к аварийному завершению программы. Это сделано для того, чтобы предотвратить некорректное использование функцииstrrchrвне контекста отладки.