• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźniki i operacje na tablicy znaków

0 głosów
86 wizyt
pytanie zadane 12 kwietnia w C i C++ przez xTMx3 Obywatel (1,320 p.)

Witam, 

niedawno na mojej uczelni ruszyliśmy z tematem wskaźników. Dostałem do napisania zadanie polegające na dopisaniu "zawartości" kilku funkcji, jednak podkreślono, że elementem wymaganym w tych zadaniach jest użycie wskaźników. Jedna z tych właśnie funkcji sprawia mi kłopot i nie mam żadnego pomysłu jak sobie z tym poradzić i to pomimo tego, że wygląda na dosyć prostą. 

Mianowicie, ma być to funkcja, która "Wyznacza wskazanie na pierwsze wystąpienie podanego znaku c w tablicy s zawierającej napis."

Tak wygląda jeden z moich pomysłów na tę funkcję w chwili obecnej: 

char * chr_str_pos(char c, char * s)
{
    for(; *s != '\0'; ++s)
    {
        if(*s == c)
        {
            // ???
        }
        else
        {
            return 0;
        }
    }
}

W miejscu gdzie wstawiłem trzy znaki zapytania pojawia się mój problem, bo nie mam pojęcia co powinno tam być. Próbowałem wpisać tam return s; ale kiedy tak robię, to funkcja nie działa poprawnie i nie wyświetla wyniku, również return *s; sprawdzałem, ale to też jest niepoprawnie i w ogóle pokazuje się przy tym na czerwono błąd.

Inną moją myślą było coś w tym stylu: 

char * chr_str_pos(char c, char * s)
{
    int pozycja = 0;

    for(; *s != '\0'; ++s)
    {
        pozycja++;

        if(*s == c)
        {
            break;
        }
    }
    return pozycja;
}

Jednakże nie mam żadnego pomysłu jak to zmienić na taką wersję w której pozycja nie jest intem no i żeby działało. 

Stąd moje pytanie, czy mógłby ktoś pomóc mi z tym i jakoś nakierować mnie na właściwe rozwiązanie?

Będę wdzięczny za wszelkie podpowiedzi. 

2 odpowiedzi

+1 głos
odpowiedź 12 kwietnia przez adrian17 Ekspert (320,760 p.)
wybrane 21 kwietnia przez xTMx3
 
Najlepsza

Pierwsze wygląda trochę sensowniej. Problem nie jest w używaniu wskaźników, a w logice.

Wrzucam kod bez poprawek, ale z komentarzami:

    for(; *s != '\0'; ++s) // OK
    {
        if(*s == c) // OK
        {
            // skoro znak pasuje, to powinienes zwrocic
            // wartosc wskaznika wskazujacego na ten znak
            // czyli po prostu s
        }
        else
        {
            return 0; // to jest zle - jesli pierwszy znak nie jest rowny c, to od razu wychodzisz z funkcji
        }
        // <- jesli petla sie skonczy bez znalezienia znaku, to musisz cos zwrocic
    }

 

komentarz 15 kwietnia przez xTMx3 Obywatel (1,320 p.)
Dziękuję za odpowiedź, jak tylko wrócę po świętach do domu, to poprawię to i dam znać czy wyszło.
komentarz 21 kwietnia przez xTMx3 Obywatel (1,320 p.)

@adrian17, poprawiłem ten (jak tak teraz patrzę) głupi błąd i działa jak należy. Dziękuję za pomoc. 

+1 głos
odpowiedź 12 kwietnia przez tangarr VIP (138,360 p.)
Twój pierwszy pomysł idzie w dobrą stronę. Gdybyś nauczył się korzystać z debuggera to szybko byś zauważył, że w przypadku gdy szukany znak nie znajduje się na pierwszym miejscu tablicy to wskakujesz w tego nieszczęsnego "elsa" i kończysz pracę funkcji. Pętla powinna kontynuować pracę aż do znalezienia znaku końca napisu i tylko w tej sytuacji powinieneś zwracać NULL.
komentarz 15 kwietnia przez xTMx3 Obywatel (1,320 p.)
Dziękuję za odpowiedź, tak jak odpisałem w komentarzu do odpowiedzi powyżej, po powrocie do domu po świętach poprawię to według podpowiedzi i dam znać jak wyszło.

A co do debuggera, nigdy go nie używałem i szczerze mówiąc, poza tym co można wywnioskować z samej nazwy, nie bardzo wiem do czego jeszcze w ogóle służy. Istnieje gdzieś w internecie jakaś stronka / filmik gdzie korzystanie z tego jest dobrze wytłumaczone? (jak poszukałem przed chwilą na YouTube to wyskoczyło dosyć sporo filmików o tym, ale nie chciałbym trafić na taki, w którym coś jest mówione nie tak, albo w sposób który tylko namiesza mi w rozumowaniu)
1
komentarz 15 kwietnia przez tangarr VIP (138,360 p.)
Debugger pozwala na śledzenie wykonania twojego programu instrukcja po instrukcji. Dzięki niemu możesz sprawdzić aktualne wartości zmiennych.
Zintegrowane środowiska programistyczne (czytaj IDE) prawie zawsze mają w sobie wsparcie dla debuggera. Dzięki czemu nie musisz sterować nim ręcznie z konsoli. Wystarczy, że zaznaczysz w swoim kodzie pułapkę (breakpoint) i uruchomisz program w trybie debugowania. Gdy program natrafi na pułapkę to wstrzyma swoje wykonanie. Debugger pokaże ci w którym miejscu program został wstrzymany, wartości zmiennych lokalnych oraz stos wywołań funkcji.
Podczas szukania informacji o debuggerze dodaj nazwę swojego środowiska programistycznego.
komentarz 17 kwietnia przez xTMx3 Obywatel (1,320 p.)
Brzmi jak całkiem spore ułatwienie. Dzięki za podpowiedź, na pewno poszukam i spróbuję ogarnąć.
komentarz 17 kwietnia przez Oscar Nałogowiec (25,750 p.)
Nauka używania debuggera to powinna być jedna z pierwszych rzeczy w nauce programowania. W momencie gdy programy zaczynają się rozejścia, pętle i zmienne jest już właściwy moment.
komentarz 21 kwietnia przez xTMx3 Obywatel (1,320 p.)

@tangarr, poprawiłem funkcję według wskazówek i działa. Dziękuję za pomoc  

komentarz 21 kwietnia przez xTMx3 Obywatel (1,320 p.)

@Oscar, gdybym wiedział o nim wcześniej pewnie bym go próbował używać. Ale niestety w tych materiałach których używałem do nauki, ani też na uczelni / w technikum nigdy o nim nie wspomniano. 

Podobne pytania

0 głosów
2 odpowiedzi 135 wizyt
pytanie zadane 24 listopada 2018 w C i C++ przez eSpring Początkujący (270 p.)
0 głosów
2 odpowiedzi 569 wizyt
pytanie zadane 28 września 2018 w C i C++ przez eSpring Początkujący (270 p.)
0 głosów
1 odpowiedź 126 wizyt

88,355 zapytań

136,952 odpowiedzi

305,666 komentarzy

58,618 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...