Prosty program z codewars

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

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

0

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

#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;
}
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.

0

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

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.

0

Coś mieszasz bo u mnie działa ;)

sss.png

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

0

może spróbuj

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

zamiast malloc'a

0

Twój kod troszke czytelniej:

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.

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