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.
Nguồn
2014-05-11 19:35:52
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
Ya, tôi chỉ chỉnh sửa nó để làm cho nó rõ ràng hơn một chút – SkippyNBS
'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. –