string jako tablica znaków - char * p

Odpowiedz Nowy wątek
2019-07-12 05:20
0

Witam,
moje pytanie jest związane z takim oto dziwnym programem (w zasadzie funkcją - nie pytajcie skąd się wzięła):

string kopiuj (string t) {
    char * p;
    for (int i = 0; i < t.length(); i++) {
        p[i] = t[i];
    }
    return p;
}

Program działa, ale zdaję sobie sprawę, że nie jest on poprawnie napisany - chodzi o to, że nie podaję długości tablicy znaków char * p, co wiąże się z tym, że nie wiadomo gdzie się ona kończy - teoretycznie może się ciągnąć w nieskończoność (poprawcie mnie jeśli nie mam racji). Podejrzewam również, że kompilator "domyśla się" na podstawie analizy pętli for, gdzie kończy się łańcuch p, po czym wstawia na jego końcu znak NULL.

Powiedzcie, czy waszym zdaniem jest to bezpieczne rozwiązanie, czy też może spowodować UB?
Jak można by inaczej kopiować nieznaną liczbę znaków z wejściowego stringa?

Pozostało 580 znaków

2019-07-12 07:12
4

UB jak nic.
Poza tym kombinacje z dupy wzięte o ile te stringi to są std::string, bo tym można zrobić bez żadnych cudactw string1 = string2;


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2019-07-12 09:30
4

@luque212 ty sobie robisz jaja? :D Przecież nie zaalokowałeś tam żadnej pamięci tylko nadpisujesz pamięć na którą przypadkiem pokazuje ten twój wskaźnik. Jak wpiszesz więcej znaków to wywali się z segfaultem. Przy odrobinie wprawy można by ten program exploitować.

nieznaną liczbę znaków z wejściowego stringa?

Serio? Nieznaną? A length tego stringa to co ci zwraca? char * p = new char[t.length()+1]


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 2x, ostatnio: Shalom, 2019-07-12 09:31

Pozostało 580 znaków

2019-07-12 09:53
0

Po co taka funkcja w ogóle skoro istnieje coś takiego jak string::c_str ?
Ktoś ładnie popłynął..

http://cpp.sh/5lq3d

edytowany 1x, ostatnio: wyebani, 2019-07-12 13:15
c_str() niczego nie kopiuje - tajny_agent 2019-07-12 10:58
Both string::data and string::c_str are synonyms and return the same value. - Delor 2019-07-12 11:36
istnieje jeszcze strcpy - wyebani 2019-07-12 12:24
aha, funkcja zwraca stringa a nie char *. To nie ważne... - wyebani 2019-07-12 13:54

Pozostało 580 znaków

2019-07-12 11:33
3

To, że ta funkcja nie wykrzacza się od razu, to po prostu niefart. Wystarczy zmiana komputera/kompilatora, albo po prostu inna historia działania aplikacji, a będzie 100% SEGFAULT.
A nawet pomijając zawartość funkcji i jedynie biorąc pod uwagę argument i wartość zwracaną, to autor chyba był nieźle najarany, bo ta funkcja nie daje żadnej funkcjonalności (nawet po naprawieniu), której std::string nie ma.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22, 2019-07-12 11:39
Ha, nie zauważyłem nawet że ta funkcja zwraca stringa i tak :D Myślałem że zwraca char* i stąd takie dziwne machinacje. - Shalom 2019-07-12 11:40
Chyba mamy nawet kandydata do perełek. - MasterBLB 2019-07-12 11:51
To bardzo dobry kawałek kodu do pytań na rozmowach rekrutacyjnych :) "Powiedz bez zmiany kodu co tu jest źle... i co jeszcze?... I jak byś go zmienił?" A że to perła, bez "dw_u_ch zdań" :> - Mokrowski 2019-07-12 13:31

Pozostało 580 znaków

2019-07-13 23:09
0

std::string zawsze posiada znaną liczbę znaków. Masz na mysli "zmienna" liczbę znaków ?

Ta funkcja nie ma sensu, nie dodaje zadnej nowej funkcjonalnosci. Implementacja rowniez jest bledna i po prostu masz fart ze zadzialalo. Zmien kompilator albo opcje optymalizacji i jest duza szansa ze wywali Ci segmentation fault.

Pozostało 580 znaków

2019-07-13 23:34
0

a wystarczyło napisać:

auto p = std::make_unique<char[]>(t.length()+1);

...
return p.get();
Pokaż pozostałe 6 komentarzy
Yyy nie załapałem żartu :/ - Delor 2019-07-14 11:44
return p.get(); gdzie p to lokalny unique_ptr? https://media.giphy.com/media/9mWg0JLV4NwM8/giphy.gif - MarekR22 2019-07-14 11:46
Jakby rozwinąć ... 'Kopiowanie std::string przez chmurę w Azure.' to już brzmi jak temat na inżynierkę. - Delor 2019-07-14 11:52
@Delor: jak na temat na inżynierkę to jest ze 3 razy za krótki :-) - Azarien 2019-07-17 11:12
To się przekopiuje trzy std::string. ;p (Najwidoczniej słowo 'prawie' wykasowałem. Początkowo tam było.) - Delor 2019-07-17 11:37

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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