C мощью функции char *strrchar (const *src, char ch) находит последнее вхождение символа ch в строку src.Происходит ошибка компиляции

Мне нужно с помощью функции char *strrchar (const *src, char ch) найти последнее вхождение символа ch в строку src.Функция должна возвращать указатель на результат. Написал функцию,которая вроде должна работать, но при попытке запуска выдает ошибку:cast to pointer from integer of different size. Как можно исправить эту ошибку чтобы программа заработала? вот мой код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *strrchar(const char *src, char ch){
int m=1,i, res = -1;
while(src[m-1] != 0){
    m++;
}
if(*src=='\0') return NULL;
else for(i=m;i>-1;i--){
    if(*(src+i)==ch) res=res+i+1;
    if(*(src+i)==ch) break;
}
if (res=='\0') return NULL;
else return (char*)res;//вот на этой строчке происходит ошибка
}
int main(void){
    const char *s="testtest";
    printf("%s",strrchar(s,'s'));
   return 0;
}

Ответы (1 шт):

Автор решения: wololo

Если в целочисленной переменной res вы пытаетесь запомнить индекс в массиве src по которому расположен искомый символ (в чём я не уверен до конца...), то возвращать нужно src + res.

Если указатель src имеет тип const char*, а возвращаемый функцией тип есть char*, то дополнительно потребуется снять константность: (char*)(src + res).

Но в целом, вашу функцию я бы переписал так:

#include <stdio.h>
#include <stddef.h>

const char *strrchar(const char *src, char ch) {
    if (!src) return NULL;

    const char* res = NULL;
    for (;; ++src) {
        if (*src == ch)
            res = src;
        if (*src == '\0')
            break;
    }

    return res;
}

int main(void) {
    const char *s = "testtest";
    printf("%s\n", strrchar(s,'s'));
    
    return 0;
}

Вывод:

st

P.S. Спецификатор преобразования "%s" требует, чтобы в функцию printf был передан ненулевой указатель, иначе поведение не определено. Т.к. функция strrchar может вернуть нулевой указатель, то нужно проявлять осторожность, передавая в printf непосредственный результат вызова strrchar.

→ Ссылка