2013-03-01 73 views
5

Tôi hiện đang thiết kế mã và một trong các hướng dẫn được đưa ra là lấy hai chữ số đầu tiên của chuỗi ký tự và thực hiện thao tác mong muốn. Mọi thứ nhỏ hơn A được tính đến. Bất cứ điều gì lớn hơn không phải là, nó chỉ mất số tiếp theo. Điều gì làm rối tung mã.Chuyển chuỗi thập lục phân thành vấn đề int chưa ký C++

Dưới đây là dòng mà chuyển đổi nó:

int x = atoi(hex.c_str); 

Tôi đang làm gì sai?

+2

Bạn đang sử dụng atoi. (Đọc thông số kỹ thuật.) –

+1

(Hãy thử strtol với cơ sở 16) –

+0

Ok, có một hướng dẫn khác chúng ta có thể sử dụng để chuyển đổi chuỗi hex thành int không dấu? –

Trả lời

14

Tôi giả định đây là ý của bạn - bạn chỉ muốn chuyển đổi hai chữ số thập lục phân đầu tiên của chuỗi thành số nguyên chưa dấu. Tôi cũng giả sử rằng chuỗi chỉ chứa các chữ số thập lục phân hợp lệ. Nếu bạn muốn xác thực chuỗi, bạn cần phải viết thêm một số mã cho điều đó.

Sử dụng strtoul để chuyển đổi chuỗi thập lục phân sang số nguyên không dấu thay thế. Cũng sử dụng phương thức substr() của lớp chuỗi để trích xuất chỉ 2 chữ số đầu tiên của chuỗi thập lục phân.

#include <string> 
#include <cstdio> 
#include <cstdlib> 

int main() 
{ 
    std::string myhex = "abcdef"; 
    unsigned int x = strtoul(myhex.substr(0, 2).c_str(), NULL, 16); 
    printf("x = %d\n", x); 
} 

Đây sẽ là đầu ra của bạn (ví dụ: 0xab = 171):

x = 171 
1
int x = strtol(hex.c_str(), NULL, 16); 

Bạn cũng có thể sử dụng sscanf nếu bạn muốn đọc một phần chuỗi. Bạn đã đề cập bạn có thể chỉ muốn lấy hai ký tự đầu tiên:

int x; 
if(1 == sscanf(hex.c_str(), "%2x", &x)) { 
    printf("Value is: %d\n", x); 
} else { 
    printf("Conversion failed\n"); 
} 

Lưu ý ở trên không thực sự là C++. Bạn có thể sử dụng modifier std::hex dòng cho điều đó (lưu ý rằng tôi gọi là chuỗi của bạn mystr thời gian này để tránh nhầm lẫn (đặc biệt nếu bạn đã nhập không gian tên std):

int x; 
std::istringstream iss(mystr); 
bool ok = (iss >> std::hex >> x); 

[sửa] Tôi nhận thấy trong bình luận của bạn, bạn hỏi về chuyển đổi sang một unsigned số nguyên. Trong trường hợp đó, tại sao bạn không tuyên bố rõ ràng số nguyên của bạn như unsigned int?

Đối unsigned, bạn nên sử dụng strtoul.

1

chức năng atoi yêu cầu cơ sở 10

thay vì sử dụng ví dụ: strtol

thường là một ý tưởng hay để đọc tài liệu. chỉ cần viết tên của hàm vào AltaVista (hoặc, cho vấn đề đó, google). và nó sẽ tìm thấy một số tài liệu cho bạn

+0

Wow! Tôi không biết Altavista vẫn còn tồn tại! –

+0

Tuy nhiên, tính năng này đã ngừng hoạt động vào ngày 8 tháng 7 năm 2013. Nó chỉ chuyển hướng đến Yahoo! – nikoliazekter

0

Nếu bạn đang chuyển đổi đến một unsigned, bạn có thể muốn sử dụng strtoul - hoặc với một tiền tố của 0x hoặc đưa ra một cơ sở của 16. Có thể là strtol cũng làm việc một cách chính xác, nhưng đó là nghĩa vụ phải cung cấp cho một giá trị có chữ ký, do đó, ít nhất bạn có thể nhận được cảnh báo để trộn ký và unsigned từ một số trình biên dịch.

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