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

question-closed C++ łączenie dwóch C-stringów - błędny wynik

Object Storage Arubacloud
0 głosów
2,844 wizyt
pytanie zadane 29 czerwca 2019 w C i C++ przez dawid2002 Mądrala (5,190 p.)
zamknięte 30 czerwca 2019 przez dawid2002

Witam! Napisałem sobie ostatnio szablon funkcji, który dodaje/łączy do siebie dwie wartości, zwracając sumę tych wartości. Wszystko było dobrze, ale gdy chciałem w ten sposób połączyć dwie wartości typu const char* , to kompilator pokazał błąd, że nie można łączyć operatorem + dwóch wartości tego typu. Dlatego napisałem, więc specjalizację dla tego typu i cały kod prezentuje się tak:

template<typename T> T dodaj(T a, T b)
{
    return a + b;
}

// specjalizacja dla typu const char*
template<> const char* dodaj<const char*>(const char* a, const char* b)
{
    string aa = a;
    string bb = b;

    string ret = aa + bb;

    return ret.c_str();

}

Problem polega na tym, że gdy program wyświetli wynik zwrócony przez tę funkcję, to wyświetlają się dziwne znaczki, np: dla takiego wywołania funkcji:

cout << dodaj("tekst1 ","tekst2");

Wyświetlają się takie znaki:

└■( Ű♠K P■( 2

W takim razie, chce was zapytać co zrobiłem źle w tym kodzie?

Z góry dzięki za pomoc!

komentarz zamknięcia: znam już odpowiedź

2 odpowiedzi

0 głosów
odpowiedź 29 czerwca 2019 przez criss Mędrzec (172,590 p.)
wybrane 29 czerwca 2019 przez dawid2002
 
Najlepsza
"c-string" to po prostu wskaźnik do pamięci ze znakami. Konkatenacja c-stringów polega na stworzeniu obszaru pamięci, który pomieści oba napisy i przekopiowaniu ich do tej pamięci. Pamiętaj o kończącym zerze.

edit: sorry, nie zauważyłem tej specjalizacji. Problem polega na tym, że ret jest obiektem lokalnym i jest niszczony po wyjściu z funkcji.
komentarz 29 czerwca 2019 przez dawid2002 Mądrala (5,190 p.)
edycja 30 czerwca 2019 przez dawid2002

Dzięki wielkie yes

Teraz zmodyfikowałem kod aby mogło wszystko ładnie działać smiley

template<typename RET = string,typename T> RET dodaj(T a, T b)
{
    return a + b;
}


template<> string dodaj<string,const char*>(const char* a, const char* b)
{
    string aa = a;
    string bb = b;

    string ret = aa + bb;

    return ret;

}

Jeśli mógłbyś mi powiedzieć, czy powyższe rozwiązanie jest najlepsze, czy jest lepszy sposób?

EDIT:

Znalazłem sam jeszcze lepszy sposób, wystarczy tylko zmienną ret uczynić zmienną statyczną:

static string ret = aa + bb;

 

komentarz 1 lipca 2019 przez j23 Mędrzec (194,920 p.)

@dawid2002, lepszy to on nie jest, bo nie możesz swojej funkcji bezpiecznie używać w programach wielowątkowych. Tym bardziej, że używasz klasy std::string, którą możesz po prostu zwrócić przez wartość.

komentarz 1 lipca 2019 przez dawid2002 Mądrala (5,190 p.)

@j23 Ok dzięki.

+2 głosów
odpowiedź 29 czerwca 2019 przez j23 Mędrzec (194,920 p.)

return ret.c_str();

Zwracasz wskaźnik na nieistniejącą (po wyjściu z funkcji) pamięć.

komentarz 29 czerwca 2019 przez dawid2002 Mądrala (5,190 p.)

Dzięki yes

Podobne pytania

+1 głos
1 odpowiedź 343 wizyt
0 głosów
2 odpowiedzi 310 wizyt
+2 głosów
1 odpowiedź 349 wizyt
pytanie zadane 30 stycznia 2018 w C# przez niezalogowany

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...