2014-05-11 20 views
5

Tôi có một chuỗi nhị phân mà sau đó tôi chuyển đổi thành số nguyên sử dụng atoi(). Khi tôi làm điều này có vẻ như tự động chuyển đổi nhị phân sang thập phân. Vấn đề là số nguyên kết quả là số âm và không đồng ý với bất kỳ trình chuyển đổi nhị phân sang thập phân trực tuyến nào. Có điều gì đó bị hỏng với atoi() không? Tôi có nên sử dụng một hàm khác thay thế không?Chuỗi nhị phân thành số nguyên với 'atoi()'

Code:

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

Cảm ơn

+0

Chính xác bạn ngụ ý gì bởi * một chuỗi nhị phân *? Một cái gì đó giống như "10001" mà bạn cần phải chuyển đổi sang '17'? – NPE

+0

Ya, tôi chỉ chỉnh sửa nó để làm cho nó rõ ràng hơn một chút – SkippyNBS

+0

'atoi()' xử lý chuỗi đầu vào là số thập phân; bạn có thể sử dụng 'strtol()' (hoặc một trong những họ hàng của nó) với '2' làm cơ sở để lấy nhị phân. –

Trả lời

14

atoi không xử lý số nhị phân, nó chỉ diễn giải chúng dưới dạng số thập phân lớn. Vấn đề của bạn là nó quá cao và bạn nhận được tràn số nguyên do nó được hiểu là số thập phân.

Giải pháp sẽ là sử dụng stoi, stol hoặc stoll đã được thêm vào string trong C++ 11. Gọi họ như

int i = std::stoi("01000101", nullptr, 2); 
  • Giá trị trả lại là chuyển đổi int giá trị.
  • Đối số đầu tiên là std::string bạn muốn chuyển đổi.
  • Thứ hai là size_t * nơi nó sẽ lưu chỉ mục của ký tự không phải chữ số đầu tiên.
  • Thứ ba là một int tương ứng với cơ sở sẽ được sử dụng để chuyển đổi ..

Để biết thông tin về chức năng nhìn vào its cppreference page.


Lưu ý rằng có cũng được pre C++ 11 chức năng với gần cùng tên, ví dụ như: strtol so với C++ 11 stol.
Chúng cũng làm việc cho các cơ sở khác nhau, nhưng chúng không thực hiện xử lý lỗi theo cách tương tự (chúng đặc biệt thiếu khi không chuyển đổi có thể được thực hiện trên chuỗi đã cho chẳng hạn như cố chuyển đổi "hello" thành chuỗi) và bạn có lẽ nên thích phiên bản C++ 11.

Để làm cho quan điểm của tôi, đi qua "Xin chào" với cả hai strtol và C++ 11 stol sẽ dẫn đến:

  • strtol lợi nhuận 0 và không cung cấp cho bạn cách nào để xác định nó như là lỗi,
  • stol từ C++ 11 ném std::invalid_argument và cho biết có điều gì đó sai.

Giải thích sai cái gì đó như "Xin chào" vì số nguyên có thể dẫn đến lỗi và nên tránh theo ý kiến ​​của tôi.

Nhưng để hoàn toàn, hãy tạo liên kết đến its cppreference page.

2

Có vẻ như bạn nên sử dụng strtol() với 2 như là đối số cuối cùng.

+0

Vì đây là câu trả lời được chấp nhận, tôi chỉ thêm rằng tôi nghĩ rằng các phiên bản C++ 11 cho chuỗi chuyển đổi số nguyên là tối ưu khi nói đến xử lý lỗi (và 'strtol' không nên được sử dụng). Thêm thông tin ở cuối câu trả lời của tôi. –

Các vấn đề liên quan