2014-05-11 18 views
5

Mam ciąg binarny, który następnie konwertuję na liczbę całkowitą przy użyciu atoi(). Kiedy to zrobię, wydaje się automatycznie konwertować plik binarny na dziesiętny. Problem polega na tym, że wynikowa liczba całkowita jest ujemna i nie zgadza się z żadnym z internetowych konwerterów binarnych na dziesiętne. Czy coś jest zepsute z atoi()? Czy powinienem zamiast tego używać innej funkcji?Binarny ciąg do liczby całkowitej z "atoi()"

Kod:

string myString = "01000101"; 
int x = atoi(myString.c_str()); 
cout << x; 

Dzięki

+0

Co dokładnie masz na myśli przez * ciąg znaków binarnych *? Coś jak "10001" ', które musisz przekonwertować na' 17'? – NPE

+0

Ya, właśnie edytowałem to, aby było nieco bardziej jasne – SkippyNBS

+0

'atoi()' traktuje ciąg wejściowy jako dziesiętny; możesz użyć 'strtol()' (lub jednego z jego krewnych) z '2' jako podstawą do uzyskania binarnego. –

Odpowiedz

14

atoi nie obsługuje liczb binarnych, po prostu interpretuje je jako duże liczby dziesiętne. Twoim problemem jest to, że jest zbyt wysoki i otrzymujesz przepełnienie liczby całkowitej, ponieważ jest interpretowane jako liczba dziesiętna.

Rozwiązaniem byłoby użyć stoi, stol lub stoll który został dodany do string C++ 11. Zadzwoń do nich jak

int i = std::stoi("01000101", nullptr, 2); 
  • Zwrócona wartość jest konwertowane wartość int.
  • Pierwszy argument to std::string, który chcesz przekonwertować.
  • Drugi to size_t *, w którym zapisze indeks pierwszej cyfry niepustej.
  • Trzeci jest int który odpowiada podstawy, że będzie stosowana do konwersji ..

Aby uzyskać więcej informacji na temat funkcji spojrzeć na its cppreference page.


pamiętać, że istnieją również pre C++ 11 działa z prawie takiej samej nazwie, jak np: strtol porównaniu do C++ 11 stol.
Działają również w różnych bazach, ale nie obsługują błędów w ten sam sposób (szczególnie brakuje im możliwości konwersji w danym ciągu znaków, np. Próby przekonwertowania "hello" na ciąg znaków) i prawdopodobnie powinieneś preferować wersje C++ 11.

aby mój punkt, przechodząc „Hello” zarówno strtol i C++ 11 stol doprowadziłoby do:

  • strtol zwrotów 0 i nie daje żadnych sposób, aby zidentyfikować go jako błędu,
  • stol z C++ 11 rzuca std::invalid_argument i wskazuje, że coś jest nie tak.

Fałszywe interpretowanie czegoś takiego jak "Witaj" jako liczby całkowite może prowadzić do błędów i należy ich unikać w mojej opinii.

Ale dla kompletności sake również link do its cppreference page.

2

Brzmi jak należy używać strtol() z 2 jako ostatni argument.

+0

Ponieważ jest to zaakceptowana odpowiedź, dodam tylko, że uważam, że wersje C++ 11 konwersji ciągów na liczby całkowite są lepsze, jeśli chodzi o obsługę błędów (i nie należy używać 'strtol'). Więcej informacji na dole mojej odpowiedzi. –

Powiązane problemy