2010-07-28 40 views
6

Tôi có mã mẫu này (không chính xác) để nhận giá trị ngoài chuỗi và lưu trữ nó trong một biến có kích thước byte (nó cần phải nằm trong một var đơn, không phải là int) :Lấy giá trị byte bằng cách sử dụng chuỗi

#include <iostream> 
#include <sstream> 

using namespace std; 

int main(int argc, char** argv) 
{ 
    stringstream ss("1"); 

    unsigned char c; 
    ss >> c; 

    cout << (int) c << endl; 
} 

Kết quả khi tôi chạy điều này là 49, không phải là điều tôi muốn thấy. Rõ ràng, điều này đang được coi là một giá trị số char và không đơn giản. C++ ish cách nào nhất để có được c để giữ 1 chứ không phải là một 49 khi đúc vào một int?

Cảm ơn!

+0

Thử chuỗi: "\ 01". Hoặc thiết lập một mảng char và khởi tạo với {1, 0} –

Trả lời

10

Nhất C++ - cách ish chắc chắn là để phân tích cú pháp giá trị đúng bằng cách đọc vào một loại không thể thiếu, và sau đó dàn diễn viên cho một loại byte (kể từ khi đọc vào một char sẽ không bao giờ phân tích - nó sẽ luôn luôn chỉ cần đọc các ký tự tiếp theo):

typedef unsigned char byte_t; 

unsigned int value; 
ss >> value; 
if (value > numeric_limits<byte_t>::max()) { 
    // Error … 
} 

byte_t b = static_cast<byte_t>(value); 

tôi đã sử dụng unsigned int vì đó là tự nhiên nhất, mặc dù unsigned short sẽ dĩ nhiên cũng làm việc.

+0

Cảm ơn bạn đã phản hồi. Tôi đã hy vọng có một số cờ định dạng, nhưng một diễn viên hoạt động quá. – twk

2

Subtract '0' từ nó:

cout << (int) (c - '0') << endl; 

'0' có giá trị 48, vì thế 49 - 48 = 1

+0

Thật không may, tôi cần giá trị đúng được lưu trữ trong var thực tế. – twk

3

Một char sẽ luôn luôn làm điều đó. Bạn cần phải đọc một int (hoặc float hoặc double, vv) hoặc nếu không thì 'formatter' sai sẽ được gọi.

unsigned char c; 
unsigned int i; 
ss >> i; 
c = i; 
+0

Sau đó, sau khi đọc int, sao chép nó vào một char! – Gianni

0
stringstream ss("1"); 
unsigned char c; 
{ 
    unsigned int i; 
    ss >> i; 
    c = i; 
} 
cout << static_cast<int>(c) << endl; 

Sẽ hoạt động. Bạn cũng có thể làm một số công cụ con trỏ không an toàn nhưng tôi sẽ chỉ đi với ở trên.

-1

Đó là vì các hằng số chuỗi trong C++ được xử lý như văn bản.
Hai lựa chọn:

  • Mã hóa chuỗi bằng thoát số:

    số
    • Octal: \ 0 <d> {1,3}
    • số Hex: \ 0x <d> { 2}

    std :: stringstream ("\ 01 \ 02 \ 03 \ 04 \ 0xFF");

  • Hoặc xây dựng một mảng của char và khởi tạo nó sử dụng số:

    dữ liệu char [] = {0, 1, 2,3, 4, 255};

Làm thế nào về:

#include <iostream> 
#include <sstream> 

using namespace std; 

int main(int argc, char** argv) 
{ 
    char x[] = {1,0}; 
    stringstream ss(x); 

    unsigned char c; 
    ss >> c; 

    cout << (int) c << endl; 
} 
Các vấn đề liên quan