Prosty program z codewars

Prosty program z codewars
GO
  • Rejestracja:około 6 lat
  • Ostatnio:5 dni
  • Postów:92
0

Witam mam problem z prostym programem ze strony codewars. Niby większość testów przechodzi, ale przy dwóch testach dostaję komunikat:
Test Crashed
Exit code: 0
Signal code: 11.
Treść zadania jest następująca napisać funkcję, która na podstawie argumentu language zwróci przywitanie w tym języku, jeśli nie ma języka w bazie to zwrócić powitanie w języku angielskim

Kopiuj
const char* greet(char *language) {
char lang[17][25]={"english","czech","danish","dutch","estonian",
                     "finnish","flemish","french",
                     "german","irish","italian","latvian","lithuanian","polish",
                     "spanish","swedish","welsh"};
const char greeting[17][25]={"Welcome","Vitejte","Velkomst","Welkom",
                         "Tere tulemast","Tervetuloa",
                         "Welgekomen","Bienvenue","Willkommen",
                         "Failte","Benvenuto","Gaidits",
                         "Laukiamas","Witamy","Bienvenido","Valkommen",
                         "Croeso"};
  int i;
  for(i=0;i<17;i++)
    if(strcmp(lang[i],language)==0)
      return greeting[i]; 
  return "Welcome";
}

wielu rzeczy już próbowałem i nic nie działa nie mam pomysłu. Proszę o jakieś wskazówki

au7h
  • Rejestracja:ponad 11 lat
  • Ostatnio:około rok
  • Postów:215
0

Jeżeli już to zrób to tak...

Kopiuj
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* greet(char *language) {
    const char lang[17][25]={"english","czech","danish","dutch","estonian",
                     "finnish","flemish","french",
                     "german","irish","italian","latvian","lithuanian","polish",
                     "spanish","swedish","welsh"};
                     
    char greeting[17][25]={"Welcome","Vitejte","Velkomst","Welkom",
                         "Tere tulemast","Tervetuloa",
                         "Welgekomen","Bienvenue","Willkommen",
                         "Failte","Benvenuto","Gaidits",
                         "Laukiamas","Witamy","Bienvenido","Valkommen",
                         "Croeso"};
                         
    char* welcomeString = malloc(sizeof(char) * 25);
    int i;
    for(i=0;i<17;i++)
        if(strcmp(lang[i],language)==0){
            strcpy(welcomeString, greeting[i]);
            return welcomeString;
        }
    strcpy(welcomeString, "Welcome");
    return welcomeString;
}

int main()
{
    char *result = NULL;
    result = greet("dutch");
    printf("%s\n", result);
    free(result);
    return 0;
}
edytowany 1x, ostatnio: au7h
Zobacz pozostałe 4 komentarze
MarekR22
pierwotnie nie popatrzyłem na main, ale widzę niekonsekwencje w greet: raz return literal a w innym wypadku return z transferem własności. Dlatego najpierw napisałem wyciek zamiast crash.
au7h
@Delor: co miałeś na myśli "ta z return"? oba wskaźniki wskazują na ten sam blok pamięci :)
Delor
Chodziło mi o to samo co @MarekR22. Jak pisałem komentarz to poprzedniego nie widziałem.
au7h
poprawione ;)
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

jw, zwracasz pointer do lokalnych zmiennych na stosie, które po wyjściu z funkcji wcale nie muszą nadal znajdować sie w pamięci. Ba, jeśli funkcja "sprawdzająca" cośtam robi po pobraniu odpowiedzi to pewnie ten stos psuje i stąd crash.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
GO
  • Rejestracja:około 6 lat
  • Ostatnio:5 dni
  • Postów:92
0

Nawet, kiedy deklarowałem i inicjowałem tablice na zewnątrz funkcji jako zmienne globalne, też dostawałem błędy.

Shalom
jasne, ale możliwe że zwyczajnie platforma nie pozwala ich tak deklarować ;]
GO
  • Rejestracja:około 6 lat
  • Ostatnio:5 dni
  • Postów:92
0

spróbowałem sposobu Au7h. Nie działa dalej są błędy. 2 błędy na ponad 50 poprawnych testów. W zadaniu jest mowa o obiektach, może gdyby to opakować w strukturę funkcja przeszła by testy. Sam nie wiem co z tym zrobić. Z drugiej strony chodzi o wynik a nie sposób pisania programu.

edytowany 2x, ostatnio: gonskabalbinka
au7h
  • Rejestracja:ponad 11 lat
  • Ostatnio:około rok
  • Postów:215
0

Coś mieszasz bo u mnie działa ;)

sss.png

  • sss.png (59 KB) - ściągnięć: 79
edytowany 1x, ostatnio: au7h
GO
  • Rejestracja:około 6 lat
  • Ostatnio:5 dni
  • Postów:92
0

titlescreenshot-20190410213426.png
Nie wiem dlaczego tak się dzieje nie mam pojęcia. Ja kompilowałem sobie to w Visual c++ i w Borlandzie i działa a dlaczego serwer wyrzuca błędy nie mam pojęcia

au7h
  • Rejestracja:ponad 11 lat
  • Ostatnio:około rok
  • Postów:215
0

może spróbuj

Kopiuj
char * welcomeString = (char*)realloc(welcomeString, 25 * sizeof(char)); 

zamiast malloc'a

GO
Też nie działa. tym razem program po prostu się nie wykonuje, błąd signal code 11. Nie mam pomysłu a przecież to takie proste zadanie.
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:26 minut
0

Twój kod troszke czytelniej:

Kopiuj
const char* greet(char* language)
{
    static const struct {
        const char* const lang;
        const char* const greeting;
    } greetings[] = {
        { "english", "Welcome" },
        { "czech", "Vitejte" },
        { "danish", "Velkomst" },
        { "dutch", "Welkom" },
        { "estonian", "Tere tulemast" },
        { "finnish", "Tervetuloa" },
        { "flemish", "Welgekomen" },
        { "french", "Bienvenue" },
        { "german", "Willkommen" },
        { "irish", "Failte" },
        { "italian", "Benvenuto" },
        { "latvian", "Gaidits" },
        { "lithuanian", "Laukiamas" },
        { "polish", "Witamy" },
        { "spanish", "Bienvenido" },
        { "swedish", "Valkommen" },
        { "welsh", "Croeso" },
    };
    static const int greetingsCount = sizeof(greetings) / sizeof(greetings[0]);

    int i;
    for (i = 0; i < greetingsCount; i++)
        if (strcmp(greetings[i].lang, language) == 0)
            return greetings[i].greeting;

    return greetings[0].greeting;
}

Tak jak ci napisał Shalom problemem są zmienne lokalne, wystarczy użyć słowa kluczowego static i problem rozwiązany.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.