Błąd przy kopiowaniu do char*

0

Witam
Zadanie z codewars
https://www.codewars.com/kata/62eb800ba29959001c07dfee/train/c
Kod żródłowy poniżej

#include <stdlib.h>
char *brightest_color (char *brightest, char const *const colors[])
{
// colors[] is NULL-terminated
// write to brightest and return it
  char R[5]="0x\0";
  char G[5]="0x\0";
  char B[5]="0x\0";
  int r;
  int g;
  int b;
  int Vmax=0;
  int maxVmax=0;
  //brightest=(char*)malloc(sizeof(char)*8);
  int index=0;
  
  for(int i=0;colors[i]!=NULL;i++)
  {
    strncat(R,colors[i]+1,2);
    strncat(G,colors[i]+3,2);
    strncat(B,colors[i]+5,2);
    r=strtoul(R,NULL,16);
    g=strtoul(G,NULL,16);
    b=strtoul(G,NULL,16);
    Vmax=fmax(r,fmax(g,b));
    printf("%d\n",Vmax);
    if(Vmax>=maxVmax){
      strcpy(brightest,colors[i]);
      printf("%s\n",brightest);
      maxVmax=Vmax;
      index=i;
    }
      //printf("%s\n",brightest);
  }
	
	return brightest;
}

I zwraca mi błąd "you must return the given string".
Proszę o pomoc powie ktoś w którym miejscu jest błąd.

1

Nie wiem dlaczego i gdzie masz akurat ten błąd, ja tylko słusznie dostałem segfaulta po uruchomieniu tej funkcji. Także może jak podmienisz swój błedny kod na ten poniżej, to Twój błąd również zniknie i będziesz mieć możliwość uruchamiania testów

char R[5]={0};
char G[5]={0};
char B[5]={0};
2

Próbowałem nic z tego. Wydaje mi się, że problem musi być gdzieś w przypisaniu do zmiennej brightest.

"U mnie działa". Jesteś pewien, że kod, który tu wkleiłeś jest tym który uruchamiasz? Dosłownie przekleiłem ten kod, naprawiłem segfaulta i testy się uruchamiają.

0

Błąd występuje, ponieważ funkcja brightest_color() nie zwraca wartości dla wszystkich możliwych ścieżek wykonywania. Zgodnie z opisem zadania na Codewars, funkcja powinna zwracać wskaźnik na ciąg znaków brightest, który zawiera najjaśniejszy kolor.

W Twoim kodzie, mimo że funkcja modyfikuje wartość brightest, nie ma żadnego zwracania tej wartości. Aby poprawić ten błąd, możesz dodać linię return brightest; na końcu funkcji brightest_color(), która zwróci wskaźnik na ciąg znaków brightest.

Poprawiony kod funkcji brightest_color():

char *brightest_color(char *brightest, char const *const colors[])
{
  char R[5] = "0x\0";
  char G[5] = "0x\0";
  char B[5] = "0x\0";
  int r;
  int g;
  int b;
  int Vmax = 0;
  int maxVmax = 0;
  int index = 0;

  for (int i = 0; colors[i] != NULL; i++)
  {
    strncat(R, colors[i] + 1, 2);
    strncat(G, colors[i] + 3, 2);
    strncat(B, colors[i] + 5, 2);
    r = strtoul(R, NULL, 16);
    g = strtoul(G, NULL, 16);
    b = strtoul(B, NULL, 16);
    Vmax = fmax(r, fmax(g, b));
    if (Vmax >= maxVmax)
    {
      strcpy(brightest, colors[i]);
      maxVmax = Vmax;
      index = i;
    }
  }

  return brightest;
}

Należy również upewnić się, że w testach funkcji brightest_color() jest przekazywany prawidłowo zaalokowany ciąg znaków brightest.

0

Najlepiej wsadź swój kod w jakiś framework testowy i zacznij sprawdzać na jakich testach pada.
twój kod pada nawet na przykładowych danych: https://godbolt.org/z/MWTYdrWTj

W mojej opinii problemem jest to, że wszystko umieściłeś w jednej funkcji. Podziel to na mniejsze funkcje zadania, a kod sam się naprawi.
Proponuje:

typedef struct {
 int r, g, g;
} Color;

int color_parse(Color *c, const char*);
int color_compare_brightness(Color a, Color b);
...
char *brightest_color(char *brightest, char const *const colors[]);

Moja wersja: https://godbolt.org/z/dcWfMPa49

1 użytkowników online, w tym zalogowanych: 0, gości: 1