o co chodzi?

0

Witam serdecznie,

Dopiero zaczynam raczkować w C i już mam pewien problem. Mianowicie mam taki kod:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h> /*strchr() strcpy() strcmp() strlen() strcat() strstr()*/

char tracks[][80]={
    "utwor 1",
    "utwor 2",
    "utwor 3",
    "utwor 4",
    "utwor 5"
    };

void wyszukaj(char szukaj[] ){
    int i;

    for(i=0;i<5;i++){
        if(strstr(tracks[i],szukaj))
        {
        printf("Utwór znajduje się na pozycji: %i\n",i);
        }else{
        printf("i=%i\n",i);
    }
    }
}

int main()
{

char szukaj[80];

printf("Wprowadź wyszukiwany track: \n");
fgets(szukaj, 80, stdin);

wyszukaj(szukaj);

return 0;
}

Program ma wyszukać łańcuch znaków w tablicy "tracks" ale czegokolwiek bym nie wpisał to wynik zawsze jest ten sam:

 Wprowadź wyszukiwany track:
utwor 3
i=0
i=1
i=2
i=3
i=4

Po prostu nie wyszukuje mi niczego.
kod kompiluje za pomocą:

gcc 11.c -o wynik -Werror -Wall -W -pedantic -ansi 

Bardzo proszę o pomoc bo nie wiem o co chodzi...

1

Ja dawno w C nie pisałem, ale mnie się wydaje, że fgets() nie robi tego co myślisz, że robi. Może użyj podstawowych funkcji scanf itd?

Edit. ok, teraz zobaczyłem co robisz ;P mój błąd. fgets nie jest złe

2

fgets pobiera znak '\n' - więc zacznij od sprawdzenia, czy ostatni znak nie jest '\n' - jeśli jest podmien go na '\0'.

1

fgets() wczytuje również znak końca linii, który musisz usunąć przed rozpoczęciem wyszukiwania.

fgets(szukaj, 80, stdin);
char *wsk;
if ((wsk = strchr(szukaj, '\r')) || (wsk = strchr(szukaj, '\n')))
{
    *wsk = 0;
}
0

bardzo dziękuję za odpowiedź:) faktycznie jest tak jak mówicie:)

0

No dobra ale czegoś nie rozumiem.

Dlaczego poniższy kod działa:

 
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /*strchr() strcpy() strcmp() strlen() strcat() strstr()*/

char tracks[][80]={
    "utwor 1",
    "utwor 2",
    "utwor 3",
    "utwor 4",
    "utwor 5"
    };

void wyszukaj(char szukaj[] ){
    int i;
    for(i=0;i<5;i++){
        if(strstr(tracks[i],szukaj))
        {
        printf("Utwór znajduje się na pozycji: %i\n",i);
        }else{
        printf("i=%i\n",i);
    }
    }
}

int main()
{

char szukaj[80];

printf("Wprowadź wyszukiwany track: \n");
fgets(szukaj, 80, stdin);

char *wsk;
if ((wsk = strchr(szukaj, '\r')) || (wsk = strchr(szukaj, '\n')))
{
    *wsk = 0;
}

wyszukaj(szukaj);

return 0;
}

Przecież ten kod:

 

char *wsk;
if ((wsk = strchr(szukaj, '\r')) || (wsk = strchr(szukaj, '\n')))
{
    *wsk = 0;
}

Nic właściwie nie robi... nie wykorzystuje w kodzie nigdzie wskaźnika "wsk". Kod ok zrobił tyle że przypisał wskaźnikowi wartość 0 w miejsce \r lub \n ale to wszystko. Później i tak tej informacji nigdzie nie wykorzystuję a okazuje się że programik z tym kodem powyżej działa a bez niego nie... ale że o co chodzi???

1

Nie przypisał wskaźnikowi wartości 0, a pod adres, na który wskazywał aktualnie wskaźnik podstawił 0.

0

aaaaaa i wszystko jasne:) dziękuję za odpowiedź zapomniałem że wskaźnik wskazuje na adres:/
taka dupa ze mnie:/

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