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

Implementacja funkcji, wskaźniki

Object Storage Arubacloud
0 głosów
1,030 wizyt
pytanie zadane 28 września 2018 w C i C++ przez eSpring Początkujący (270 p.)

Dostałem zadanie, kompletnie nie wiem jak się za nie zabrać.

Zaimplementuj funkcję, obliczającą długość napisu przekazanego jako parametr. Funkcja ma mieć sygnaturę:

int string_length(const char *s);

W funkcji main(int argc, char **argv) wypisać za pomocą string_length() długość każdego argumentu programu przekazanego w argv.

Za podpowiedzi oraz innego typu wskazówki z góry dziękuje! 

2 odpowiedzi

0 głosów
odpowiedź 28 września 2018 przez RafalS VIP (122,820 p.)
Wykorzystaj fakt, że cstring to tablica charów zakończona nullem '\0'. Po tablicy można przeiterować :D Więcej nie podpowiem :P
0 głosów
odpowiedź 29 września 2018 przez afferu Mądrala (5,220 p.)
#include <iostream>

//const char *s jest równoważne z const char s[]
int string_length(const char * s)
{
    //size_t to specjalny typ do liczenia wielkości
    std::size_t i{};
    //Sprawdź czy pointer s nie jest pusty
    if(s){
        //Pobierz znak z tablicy z pozycji "i" i porównaj ze znakiem '\0'
        //jeśli są różne to wykonaj ciało funkcji(zinkrementuj licznik) 
        while(s[i] != '\0'){
            i++;
        }
        //operator [] oblicza adres o "i" wielkości char (w bajtach) dalej licząc od adresu "s" i dokonuje dereferencji
    }
    //Zwróć wartość licznika przez wartość
    return i;
}

int main(int argc, char** argv)
{
    //argc zawiera liczbę argumentów, argv jest jak tablica dwuwymiarowa typu char
    for(int i{int()}; i<argc; ++i)
    {
        //argv[i] pobiera wskaźnik na pierwszy znak/początek/adres kolejnych tablic znaków
        //tablice znaków stosowane w C zawierają(powinny zawierać) na końcu specjalny znak '\0' tzw. delimiter albo NULL character
        //Warto zwrócić uwagę, że operator << automatycznie rozpozna odpowiednie przeciązenie operatora i wypisze string w formacie C
        std::cout << '[' << i << "] = " << argv[i] << "; length =" << string_length(argv[i]) << '\n';
    }

    return 0;
}

Zadanie bardzo proste, wystarczy tylko poszukać w internecie informacji na temat zagadnień jakie ono porusza.

Wyjście programu:

[0] = (...).exe; length =69 //ścieżka do pliku wykonywalnego, zależne od systemu operacyjnego
[1] = test1; length =5
[2] = test2; length =5
[3] = test3; length =5
[4] = test4; length =5
[5] = abcd; length =4
[6] = 1234; length =4
[7] = aaaa; length =4
[8] = bbb; length =3
[9] = cc; length =2
[10] = d; length =1

 

1
komentarz 29 września 2018 przez draghan VIP (106,230 p.)

Staramy się nie dawać gotowców! sad

komentarz 29 września 2018 przez j23 Mędrzec (194,920 p.)
Z drugiej strony problem jest tak banalny, że ciężko nie dać gotowca ;)
komentarz 29 września 2018 przez Hiskiel Pasjonat (22,830 p.)
int string_length(const char* str){
    return strlen(str);
}

Co nie jest zabronione, jest dozwolone

komentarz 29 września 2018 przez draghan VIP (106,230 p.)
@Hiskiel - masz tutaj dwa potencjalne błędy. Jakie? :D
komentarz 29 września 2018 przez Hiskiel Pasjonat (22,830 p.)
edycja 29 września 2018 przez Hiskiel
Na pewno to, że strlen zwraca size_t, ale to się chyba automatycznie castuje.

Drugi to brak obsługi potencjalnego błędu.
komentarz 29 września 2018 przez draghan VIP (106,230 p.)

Na pewno to, że strlen zwraca size_t, ale to się chyba automatycznie castuje.

Jup. Może się okazać, że otrzymasz nagle ujemną wartość długości łańcucha.

Drugi to brak obsługi potencjalnego błędu.

Drugi to niesprawdzenie, czy wskaźnik podany jako argument nie jest przypadkiem nullem.

komentarz 29 września 2018 przez Hiskiel Pasjonat (22,830 p.)
Oh, ale czy strlen czasem nie ma mechanizmu sprawdzania, czy wskaźnik jest nullem? Potem ewentualnie, jeśli zwróci zero (obsługa błędu) zrobić coś tam.
komentarz 29 września 2018 przez draghan VIP (106,230 p.)
W dokumentacji nic na ten temat nie ma, zatem dobrze założyć, że nie ma takiej obsługi. Plus warto jeszcze sprawdzić, czy w podanym łańcuchu (bo chyba zakładamy, że otrzymany wskaźnik pokazuje na tablicę) w ogóle znajduje się znak '\0' - w przeciwnym razie mamy UB. Zaś do tego trzeba byłoby znać maksymalną dopuszczalną długość łańcucha.
komentarz 29 września 2018 przez j23 Mędrzec (194,920 p.)

@Hiskiel, Nie ma takiego sprawdzania, bo po co miałoby być? Funkcja oczekuje c-stringa i wywołujący ma jej go dostarczyć.

Podobne pytania

0 głosów
2 odpowiedzi 223 wizyt
pytanie zadane 12 kwietnia 2022 w C i C++ przez xTMx3 Obywatel (1,560 p.)
0 głosów
2 odpowiedzi 360 wizyt
pytanie zadane 24 listopada 2018 w C i C++ przez eSpring Początkujący (270 p.)
0 głosów
3 odpowiedzi 1,997 wizyt
pytanie zadane 22 sierpnia 2016 w C i C++ przez Paściak Arek Nowicjusz (120 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...