Wystarczy krótkie pytanie. Rozejrzałem się po Internecie i znalazłem kilka rozwiązań, ale żadne z nich jeszcze nie działało. Patrząc na konwersję ciągu na int i nie mam na myśli kodów ASCII.
W celu szybkiego skrócenia przekazujemy równanie jako ciąg znaków. Mamy go rozbić, poprawnie sformatować i rozwiązać równania liniowe. Mówiąc to, nie jestem w stanie przekonwertować ciągu na wartość int.
Wiem, że ciąg będzie w formacie (-5) lub (25) itd., Więc zdecydowanie jest to int. Ale jak wyciągamy to z łańcucha?
Jednym ze sposobów, w jaki myślałem, jest przepuszczenie pętli for / while przez ciąg, sprawdzenie cyfry, wyodrębnienie wszystkich cyfr po tym, a następnie sprawdzenie, czy na początku było „-”, jeśli istnieje, pomnóż int przez - 1.
Wydaje się to jednak nieco skomplikowane w przypadku tak małego problemu. Jakieś pomysły?
atoi()
?std::string
myString
i chcesz użyćatoi
, to chcesz powiedziećatoi(myString.c_str())
.Odpowiedzi:
W C ++ 11 jest kilka nowych, ciekawych funkcji konwersji z
std::string
na typ liczbowy.Więc zamiast
możesz użyć
gdzie
str
jest twój numer jakostd::string
.Istnieje wersja dla wszystkich smaków liczb:
long stol(string)
,float stof(string)
,double stod(string)
, ... zobacz http://en.cppreference.com/w/cpp/string/basic_string/stolźródło
"11x"
na liczbę całkowitą11
.from_chars
C ++ 17? Ma być o rząd wielkości szybszy niżstoi
.stoi
powinno być preferowane. Zobacz dlaczego nie powinienem używać atoi ()?Aby być w pełni poprawnym, sprawdź flagi błędów.
źródło
-5
z(-5)
.Możliwe opcje opisano poniżej:
1. Pierwsza opcja: sscanf ()
Jest to błąd (również pokazany przez cppcheck), ponieważ „scanf bez ograniczeń szerokości pola może ulec awarii z ogromnymi danymi wejściowymi w niektórych wersjach libc” (patrz tutaj i tutaj ).
2. Druga opcja: std :: sto * ()
To rozwiązanie jest krótkie i eleganckie, ale jest dostępne tylko w kompilatorach zgodnych z C ++ 11.
3. Trzecia opcja: sstreams
Jednak dzięki temu rozwiązaniu trudno jest odróżnić złe dane wejściowe (patrz tutaj ).
4. Czwarta opcja: Boost's lexical_cast
Jest to jednak tylko opakowanie
sstream
, a dokumentacja sugeruje użycie wsstream
celu lepszego zarządzania błędami (patrz tutaj ).5. Piąta opcja: strto * ()
To rozwiązanie jest bardzo długie ze względu na zarządzanie błędami i zostało opisane tutaj. Ponieważ żadna funkcja nie zwraca zwykłej liczby całkowitej, konwersja jest konieczna w przypadku liczby całkowitej (zobacz tutaj, jak można uzyskać tę konwersję).
6. Szósta opcja: Qt
Wnioski
Podsumowując, najlepszym rozwiązaniem jest C ++ 11
std::stoi()
lub, jako druga opcja, użycie bibliotek Qt. Wszystkie inne rozwiązania są odradzane lub zawierają błędy.źródło
użyj funkcji atoi, aby przekonwertować ciąg na liczbę całkowitą:
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
źródło
atoi
.strtol
robi wszystkoatoi
, ale lepiej i zawiedzie bezpiecznie.Co z Boost.Lexical_cast ?
Oto ich przykład:
źródło
Wprawdzie moje rozwiązanie nie działałoby dla ujemnych liczb całkowitych, ale wyodrębni wszystkie dodatnie liczby całkowite z tekstu wejściowego zawierającego liczby całkowite. Wykorzystuje
numeric_only
ustawienia regionalne:Wprowadź tekst:
Wyjściowe liczby całkowite:
Klasa
numeric_only
jest zdefiniowana jako:Kompletne demo online: http://ideone.com/dRWSj
źródło
Prawdopodobnie jest to trochę przesada, ale
boost::lexical_cast<int>( theString )
powinno dobrze działać.źródło
boost::lexical_cast<int>( theString )
(gdzietheString
jest nazwa zmiennej zawierającej ciąg, na który chcesz przekonwertowaćint
).atoi
jest wbudowaną funkcją, która konwertuje ciąg na liczbę całkowitą, przy założeniu, że ciąg zaczyna się od reprezentacji liczby całkowitej.http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
źródło
atoi
, użyjstrtol
zamiast tego.W systemie Windows możesz użyć:
strtol
,stringstream
musisz określić podstawę, jeśli chcesz interpretować wartość szesnastkową.źródło
Cóż, wiele odpowiedzi, wiele możliwości. Brakuje mi tutaj uniwersalnej metody, która konwertuje ciąg znaków na różne typy całek C ++ (short, int, long, bool, ...). Wymyśliłem następujące rozwiązanie:
Oto przykłady użycia:
Dlaczego po prostu nie użyć operatora strumienia wyjściowego do konwersji łańcucha na typ integralny? Oto odpowiedź: Powiedzmy, że łańcuch zawiera wartość, która przekracza limit zamierzonego typu całki. Na przykład na Wndows 64 max int wynosi 2147483647. Przypiszmy do ciągu wartość max int + 1: string str = "2147483648". Teraz podczas konwertowania ciągu na int:
x staje się 2147483647, co jest zdecydowanie błędem: ciąg „2147483648” nie miał zostać przekonwertowany na int 2147483647. Podana funkcja toIntegralType wykrywa takie błędy i zgłasza wyjątek.
źródło
Od http://www.cplusplus.com/reference/string/stoi/
Wynik:
2001, A Space Odyssey: 2001 i [, A Space Odyssey]
40c3: 16579
-10010110001: -1201
0x7f: 127
źródło
Mój kod:
źródło
źródło
Aby przekonwertować reprezentację ciągu na wartość całkowitą, możemy użyć std :: stringstream.
jeśli przekonwertowana wartość jest poza zakresem dla typu danych liczb całkowitych, zwraca INT_MIN lub INT_MAX.
Również jeśli wartość ciągu nie może być reprezentowana jako poprawny typ danych int, zwracane jest 0.
Wyjście: 50
Zgodnie z powyższymi danymi wyjściowymi możemy przekonwertować je z liczb ciągów na liczbę całkowitą.
Źródło i więcej w ciągu do int c ++
źródło
Jedna z wersji linia:
long n = strtol(s.c_str(), NULL, base);
.(
s
jest ciągiem ibase
jestint
taki jak 2, 8, 10, 16.)Możesz zapoznać się z tym linkiem, aby uzyskać więcej informacji na temat
strtol
.Podstawową ideą jest użycie
strtol
funkcji, która jest zawarta wcstdlib
.Ponieważ
strtol
tylko obsługuje się zchar
tablicą, musimy przekonwertowaćstring
nachar
tablicę. Możesz skorzystać z tego linku .Przykład:
który wyświetli:
źródło
jest inny prosty sposób: załóżmy, że masz taką postać,
c='4'
dlatego możesz wykonać jeden z następujących kroków:1st: int q
q=(int) c ; (q is now 52 in ascii table ) . q=q-48; remember that adding 48 to digits is their ascii code .
drugi sposób:
q=c-'0'; the same , character '0' means 48
źródło
string
naint
zamiast zchar
nastring
.