Funkcja zwracająca wskaznik na znaleziony element (struktury)

0

Struktury:

typedef struct Product{
    char name[NSIZE];
    double price;
}Product;
typedef struct Menu{
    int amount;
    Product menu[NTAB];
}Menu; 

Aktualna zawartosc:

Menu meals={.menu[0]={"Fish & Chips",19.99},.menu[1]={"Beef Burger",15.99},.menu[2]={"Seafood",28.99},.menu[3]={"Chicken nuggets",13.99},.menu[4]={"Spaghetti",17.99},.amount=5}; //Przykladowe menu restauracji

Witam, potrzebuje pomocy w napisaniu funkcji ktora po podaniu w main czesci wyrazu np. "Spagh" zwroci wskaznik na odpowieni wyraz tablicy w tym wypadku - menu[4].
Na ten moment funcja wyglada tak i wiem niestety ze jest w tym mnostwo bledow ale dopiero zaczynam i nie wiem sam jak to zrobic

Product * func(char usrtxt[],Menu *ftxt,int amnt){
    int counter_txt=0;
    Product * foundptr;
    for(int i=0;usrtxt[i]!='\0';i++) counter_txt++;
    for(int j=0;j<amnt;j++){
        for(int k=0;k<counter_txt;k++){
            if(usrtxt[k]==ftxt->menu[j].name[k]) foundptr=&(ftxt->menu[j]);
        }
    } return foundptr;
}
1

Podziel to na mniejsze funkcje (np. dodaj funkcję strncmp()). To uprości Ci kod i uwypukli błędy.

0

Dzieki wielkie, nie znalem tej funkcji ale mam prosbe czy moglbys pomoc mi z warunkiem if?
Wskaznik ftxt wskazuje na zmienna mels.

Menu * func(char usrtxt[],Menu *ftxt,int amnt){
    int counter_txt=0, counter_order=0;
    Menu * foundptr;
    for(int i=0;usrtxt[i]!='\0';i++) counter_txt++;
    for(int j=0;j<amnt;j++){
        for(int k=0;k<=counter_txt;k++){
           if(strncmp(usrtxt,ftxt->menu[j].name,counter_txt)==0) foundptr=&(ftxt->menu[j]); // tutaj
        }
    } return foundptr;
}

Mam na mysli ta czesc z komentarzem, gdyz nie moge tu zwrocic wskaznika na odpowiednia tablice (menu[4] dla przykladu) i prawdopodobnie zle mam zadeklarowany wskaznik a nie mam pomyslu jak to poprwnie ustawic - czy to ma byc wskaznik typu Menu, czy typu Product.

1

Inna przydatna funkcja: strlen().
Gdy nazwiesz zmienną inaczej:

typedef struct Menu{
    int amount;
    Product produkts[NTAB];
}Menu;

to powinno być łatwiejsze do zrozumienia co jest czym.
Ta pętla wewnętrzna (z int k) jest niepotrzebna.
W warunku if możesz od razu zwrócić wartość (return &...). Na końcu, wtedy, zwracasz tylko wartość domyślną (oznaczającą brak szukanych elementów).

1

Pisane z palca, więc mogą być błędy typu brakujący cast literówki itp:

struct Product* MenuFindProductMatching(struct Menu* menu, int (*predicate)(struct Product*, void* context), void* context)
{
    for (int i = 0; i < menu->amount; ++i) {
        if (predicate(menu->menu + i, context)) {
            return menu->menu + i;
        }
    }
    return NULL;
}

int ProductNameContains(struct Product* product, const char* subName)
{
    return strstr(product->name, subName) != NULL;
}

struct Product* MenuFindProductWhicNameContains(struct Menu* menu, const char* subName)
{
    return MenuFindProductMatching(menu, ProductNameContains, subName);
}
0

Dzieki wielkie za pomoc juz poprawilem kod i dziala. Lapcie plusiki za pomoc :)

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