Jaki jest najbezpieczniejszy i najlepszy sposób na odzyskanie długa bez znaku z łańcucha w C++?Jak uzyskać długi ciąg bez znaku?
Wiem o wielu możliwych metodach.
Najpierw konwertowane podpisane długie wzięte z atolu.
char *myStr; // Initalized to some value somehow.
unsigned long n = ((unsigned)atol(myStr));
Oczywistym problemem jest to, co dzieje się, gdy wartość przechowywana w myStr jest większa, niż może zawierać podpisana wartość long? Co pobiera atol?
Następną możliwością jest użycie strtoul.
char *myStr; // Initalized to some value somehow.
unsigned long n = strtoul(myStr, 0, 10);
Jest to jednak nieco zbyt skomplikowane dla moich potrzeb. Chciałbym prostą funkcję, string in, unsigned long base 10 out. Ponadto obsługa błędów pozostawia wiele do życzenia.
Ostatnią możliwą możliwością jest użycie sscanf.
char *myStr; // Initalized to some value somehow.
unsigned long n = 0;
if(sscanf(myStr, "%lu", n) != 1) {
//do some error handling
}
I znowu, obsługa błędów pozostawia wiele do życzenia i jest nieco bardziej skomplikowana, niż bym chciał.
Pozostałą oczywistą opcją jest napisanie własnej albo otoki wokół jednej z poprzednich możliwości lub czegoś, które przechodzi przez ciąg i ręcznie konwertuje każdą cyfrę, aż osiągnie ULONG_MAX.
Moje pytanie brzmi, jakie są inne opcje, których moje google-fu nie udało się znaleźć? Jakąkolwiek rzecz w bibliotece standardowej C++, która w czysty sposób przekształci ciąg znaków w unsigned long i wyrzuci wyjątki w przypadku niepowodzenia?
Przepraszam, jeśli to dupek, ale nie mogłem znaleźć żadnych pytań, które dokładnie pasowałyby do moich.
'atol':" Jeśli poprawna wartość wykracza poza zakres reprezentowalnych wartości, zwracane są LONG_MAX lub LONG_MIN. " http://www.cplusplus.com/reference/clibrary/cstdlib/atol/ –
Kilka pytań, nie jestem pewien, czy są to duplikaty: (1) http://stackoverflow.com/questions/1243428/convert- string-to-int-with-bool-fail-in-c/1243435 (2) http://stackoverflow.com/questions/1435253/c-syntax-question-if-var-type-int/1435268 – GManNickG
Ja don nie rozumiem, co masz przeciwko strtoul. Jest to idealna funkcja do tego. Przekaż 0 dla bazy i będzie konwertować liczby z dowolnymi łańcuchami prefiksów bazowych, które odczytała twoja biblioteka C, takimi jak "0x". –