#Re-implement strrchr.c function

8 messages · Page 1 of 1 (latest)

lofty idol
#

As part of 1st project at 42 school, I have to make my own C library(libft) by re-implement some C functions. My code has to mimic default behaviour unless told otherwise.

However for Test 5 and 6 my code's result is not the same as the standard library. Where did I go wrong with my implementation?

char    *ft_strrchr(const char *str, int c)
{
     char    *save;
     char    chr;

     save = 0;
     chr = c;
     if (chr == 0)
         return (save);
     while (*str != '\0')
     {
         if (*str == chr)
         {
             save = (char *)str;
         }
         str++;
     }
     return (save);
}```

This is my main.c that I'm testing the code with:

```c
#include <stdio.h>
#include <string.h>

char \*ft_strrchr(const char *str, int c)

int main(void)
{
    char    string1[] = "bonjour";
    char    string2[] = "bonjourno";
    char    search[8];
    search[0] = 'b';
    search[1] = 'o';
    search[2] = 'o';
    search[3] = 'j';
    search[4] = 's';
    search[5] = '\0';
    search[6] = '\0';
    search[7] = 'b';

    printf("\n");

    printf("Search 0\nori: [%s]\nft_: [%s]\n\n", strrchr(string1, search[0]), ft_strrchr(string1, search[0]));
    printf("Search 1\nori: [%s]\nft_: [%s]\n\n", strrchr(string1+4, search[1]), ft_strrchr(string1+4, search[1]));
    printf("Search 2\nori: [%s]\nft_: [%s]\n\n", strrchr(string2+8, search[2]), ft_strrchr(string2+8, search[2]));
    printf("Search 3\nori: [%s]\nft_: [%s]\n\n", strrchr(string1+3, search[3]), ft_strrchr(string1+3, search[3]));
    printf("Search 4\nori: [%s]\nft_: [%s]\n\n", strrchr(string1, search[4]), ft_strrchr(string1, search[4]));
    printf("Search 5\nori: [%s]\nft_: [%s]\n\n", strrchr(string1+7, search[5]), ft_strrchr(string1+7, search[5]));
    printf("Search 6\nori: [%s]\nft_: [%s]\n\n", strrchr(string2, search[6]), ft_strrchr(string2, search[6]));
    printf("Search 7\nori: [%s]\nft_: [%s]\n\n", strrchr(string1+2, search[7]), ft_strrchr(string1+2, search[7]));
return(0);
}```
cursive hingeBOT
#

When your question is answered use !solved to mark the question as resolved.

Remember to ask specific questions, provide necessary details, and reduce your question to its simplest form. For tips on how to ask a good question use !howto ask.

proper gulch
#

printf("Search 5\nori: [%s]\nft_: [%s]\n\n", strrchr(string1+7, search[5]), ft_strrchr(string1+7, search[5]));

here youre searching for the \0 in string1 which conveniently even points to the \0

     char    *save;
     char    chr;

     save = 0;
     chr = c;
     if (chr == 0)
         return (save);

what you return here is an uninitialized variable

#

what should be returned is a pointer to \0 in string1

lofty idol
#

Thank you @proper gulch . I have to brush up more on C Pointers and more basic C knowledge

#

My new code uses my own ft_strlen, plus having the NULL check return source string + string length so that it will point to \0 instead of returning (null) in my main

#
int    ft_strlen(const char *str)
{
    int    length;

    length = 0;
    while (str[length] != '\0')
    {
        length++;
    }
    return (length);
}

char    *ft_strrchr(const char *str, int c)
{
    char    *save;
    char    chr;

    save = 0;
    chr = c;
    if (chr == 0)
        return ((char *)str + ft_strlen(str));
    while (*str)
    {
        if (*str == chr)
        {
            save = (char *)str;
        }
        str++;
    }
    return (save);
}
#

!solved