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

C++ specjalizacja zwracająca adres

Object Storage Arubacloud
0 głosów
176 wizyt
pytanie zadane 27 października 2016 w C i C++ przez sofnir Gaduła (4,690 p.)

Hej, napisałem specjalizację, która zwraca najdłuższy napis. Chciałbym ją zmodyfikować żeby zwracała adres tego napisu, a nie tekst.

template <> char *maxn<char*>(char *tab[], int tabSize)
{
    char *p = tab[0];
    for(int i = 1; i < tabSize; i++)
    {
        if(strlen(tab[i]) > strlen(p))
            p = tab[i];
    }

    return p;
}

W mainie:

char *tab3[] = {"Korea", "Panie Janie", "Rano wstan", "ding dang dong", "PA"};
    cout << maxn(tab3, 5);

Obecnie po odpaleniu programu mam na wyjściu napis: "ding dang dong", chodzi mi o to, w jaki sposób zmodyfikować funkcję, żeby zwracała adres do tego napisu?

1 odpowiedź

0 głosów
odpowiedź 28 października 2016 przez criss Mędrzec (172,590 p.)
wybrane 28 października 2016 przez sofnir
 
Najlepsza

Teraz zwraca adres do napisu. Tyle, że operator<< cout-a działa w taki sposób, że jeśli dostanie wskaźnik na char to próbuje wypisać napis (tzn. kolejne bajty - litery - od podanego adresu kończąc gdy natrafi na znak '\0'). Żeby wypisać adres, po prostu przekonwertuj wartość zwróconą przez funkcje na void*.

cout << static_cast<void *>(maxn(tab3, 5));

Druga sprawa :

char *tab3[] = {"Korea", "Panie Janie", "Rano wstan", "ding dang dong", "PA"};

Czegoś takiego nie rób. Łańcuchy znaków przypisane w taki sposób do wskaźnika :

char * str = "slfhksdhf";

są zapisywane w pamięci tylko do odczytu i próba ich modyfikowania to UB. 
http://stackoverflow.com/questions/5343721/cant-modify-char-memory-access-violation

Dlatego albo dodaj const do typu tablicy (żebyś przypadkiem nie próbował modyfikować tych stringów), albo zastosuj sie do tego co napisał w odpowiedzi gość w zalinkowanym temacie na SO.

komentarz 28 października 2016 przez sofnir Gaduła (4,690 p.)

Dzięki za odpowiedź. Robię zadanie z książki Stephena Prata, czegoś takiego jak przekonwertowanie tej wartości na void jeszcze nie było, więc może dobrze zrobiłem to zadanie. Zostawię to jak jest. 

Jeśli chodzi o ten błędny zapis to masz rację powinno być:

const char *tab3[] = {"Korea", "Panie Janie", "Rano wstan", "ding dang dong", "PA"};

... i wtedy w funkcji też wszędzie const char* zamiast char*. Dzięki za zwrócenie uwagi.

 

Podobne pytania

+1 głos
2 odpowiedzi 321 wizyt
pytanie zadane 14 września 2016 w C i C++ przez Kasztan Dyskutant (8,080 p.)
0 głosów
2 odpowiedzi 153 wizyt
pytanie zadane 14 lutego 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
1 odpowiedź 875 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...