Создать собственную функцию strrchr(), но без учета регистра

мое упражнение состоит в том, чтобы создать свою собственную функцию strrhr() в c.

Мое решение - цикл. Я считаю длину массива. Я введу это число в цикл for. Например: При вводе Hello. Я пойду справа налево искать письмо.

Что не работает, так это возвратная часть.

Мой код возвращает следующее с вводом Hello и буквой поиска l. Ло. Это не то, что мне нужно. Мой вывод должен быть lleH.

Есть идеи, что я сделал не так?

    char *KULstrrcichr(char *arr, char search)

// The strrchr() function returns a pointer to the last occurrence of the character c in the string s.
{   
    int stringcnt;
    stringcnt = strlen(arr);
    printf("%d\n", stringcnt);
    search = tolower(search);
    for (int i = stringcnt-1; arr[i]; i--)
    {
        arr[i] = tolower(arr[i]);
    }
    for (int i = stringcnt-1; arr[i]; i--)
    {
        if (search == arr[i])
        {
            return &arr[i];
        }
    }
    return 0;
}

Хорошо, я узнал, что мой код работает так, как ожидалось...

🤔 А знаете ли вы, что...
C оставляет множество возможностей для оптимизации кода и достижения высокой производительности приложений.


49
1

Ответ:

Решено

Стандартная функция C strrchr объявляется следующим образом

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

То есть первый параметр имеет квалификатор const, а второй параметр имеет тип int. Это означает, что вы не можете изменить исходную строку.

Также это для цикла

for (int i = stringcnt-1; arr[i]; i--)

вызывает неопределенное поведение из-за неправильного условия.

Функцию можно определить следующим образом, как показано в демонстрационной программе ниже.

#include <string.h>
#include <stdio.h>
#include <ctype.h>

char * my_strrchr( const char *s, int c )
{
    c = tolower( ( unsigned char )c );

    const char *p = s + strlen( s ) + 1;

    while (p != s && tolower( ( unsigned char )p[-1] ) != c) --p;

    return p == s ? NULL : ( char * )( p - 1 );
}

int main( void )
{
    char s[] = "helLo";

    char *p = my_strrchr( s, 'l' );

    if (p != NULL)
    {
        printf( "position = %td, substring = %s\n", p - s, p );
    }
}

Вывод программы

position = 3, substring = Lo