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

Błąd C++ unsigned long long int na string

VPS Starter Arubacloud
0 głosów
454 wizyt
pytanie zadane 17 stycznia 2019 w C i C++ przez Igor Użytkownik (740 p.)

Witam

Mam pytanie dotyczące C++. Zapewne moja zwykła głupia niewiedza.

unsigned long long int i = 13793597544043915;
string tmp;
sprintf((char*)tmp.c_str(), "%llu", i);
cout<<">>"<<tmp.c_str()<<"<<"<<endl;

Dlaczego to wywala aplikacje, po prostu błąd 255 (0xFF). Pomijając fakt iż to działało a w pewnym momencie zaczęło wywalać aplikacje.

komentarz 17 stycznia 2019 przez gagyn Stary wyjadacz (11,050 p.)
Uważam, że lepiej skorzystać z std::to_string().

Nie po to piszesz w C++, żeby korzystać z bibliotek i funkcji języka C.

sprintf() - C

to_string() - C++

Poza tym, wydaje mi się, że używanie to_string() jest po prostu łatwiejsze. Wystarczy podać funkcji int jako argument, a nie bawić się w tablice char.

Jedynie zwróć uwagę, że to_string() jest od wersji C++11, dlatego musisz się upewnić, że kompilator ma ustawiną wersję przynajmniej 11.

1 odpowiedź

0 głosów
odpowiedź 17 stycznia 2019 przez criss Mędrzec (172,590 p.)

std::string sam sobie alokuje pamięć, to prawda, ale musi wiedzieć, że ma sobie zaalokować. Ty po prostu tworzysz pustego stringa i próbujesz coś pisać do jego wewnętrznego bufora. I tutaj dwie poważne uwagi:

  • skoro string jest pusty, to można być niemal pewnym, że c_str() da ci nullptr a nawet jeśli nie, to nie masz żadnej informacji o ilości tej pamięci
  • nie po to c_str zwraca const char*, żebyś to sobie castował na non-const i do tego pisał

Modyfikując twoją metodę, tak żeby było poprawnie:
zarezerwuj sobie na stosie pamięć w której na pewno zmieści się się reprezentacja "stringowa" liczby i dopiero z tego twórz stringa. Np.:

char buf[1024];
sprintf(buf, "%llu", i);
string tmp = buf;

Jak najlepiej? Skorzystać z std::to_string i mieć spokój

Podobne pytania

0 głosów
2 odpowiedzi 465 wizyt
pytanie zadane 1 listopada 2015 w C i C++ przez niezalogowany
0 głosów
6 odpowiedzi 4,402 wizyt
pytanie zadane 12 sierpnia 2015 w C i C++ przez gagyn Stary wyjadacz (11,050 p.)
0 głosów
1 odpowiedź 195 wizyt

92,454 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...