2009-11-26 49 views
8

Làm thế nào tôi có thể chuyển đổi char a [0] vào int b [0] trong đó b là một sản phẩm nào được cấp phát động int mảngChuyển đổi đơn char sang int

Tôi đã thử

char a[] = "4x^0"; 
int *b; 
b = new int[10]; 
char temp = a[0]; 
int temp2 = temp - 0; 
b[0] = temp2; 

tôi muốn 4 nhưng nó mang lại cho tôi giá trị ascii 52

Cũng làm

a[0] = aoti(temp); 

mang lại cho tôi lỗi: đồng không hợp lệ nPhiên bản từ ‘char’ thành ‘const char *’ khởi tạo tham số 1 của ‘int atoi (const char *)’

+0

Lưu ý rằng atoi không hoạt động vì atoi mất trong một chuỗi và không phải là một char duy nhất - vì lý do rất tốt mà hầu hết các số có nhiều hơn một chữ số! –

Trả lời

24

Bạn cần phải làm:

int temp2 = temp - '0'; 

để thay thế.

+0

Từ quan điểm luật sư ngôn ngữ, tôi cho rằng không thể giả định rằng các chữ số là tuần tự, vì vậy nó có thể không được 100% di động - mặc dù nó hoạt động ở cả ASCII (và phần mở rộng của nó) và EBCDIC. khỏe. –

+13

Đáng ngạc nhiên là hoàn toàn tốt, ngay cả với luật sư ngôn ngữ - ISO C90 có yêu cầu không rõ ràng sau: "Trong cả hai ký tự cơ bản nguồn và thực thi, giá trị của mỗi ký tự sau 0 trong danh sách chữ số thập phân ở trên sẽ lớn hơn so với giá trị của trước đó ". –

+0

Rất tốt, @Pavel. Có rất nhiều mã viết giả định rằng các chữ cái cũng tiếp giáp, làm cho nó trở thành một PITA hoàng gia để chuyển sang hệ thống con UNIX của máy tính lớn (USS, sử dụng EBCDIC, không bị nhầm lẫn với zLinux sử dụng ASCII). Khác với bộ ký tự tối thiểu khá hạn chế và tính chất tiếp giáp của các ký tự số, ISO C không thực sự ủy thác nhiều trong khu vực đó. – paxdiablo

1

Phiên bản atoi() không hoạt động vì atoi() hoạt động trên các chuỗi chứ không phải các ký tự riêng lẻ. Vì vậy, đây sẽ làm việc:

char a[] = "4"; 
b[0] = atoi(a); 

Lưu ý rằng bạn có thể bị cám dỗ để làm: atoi (& temp) nhưng điều này sẽ không làm việc, như & tạm thời không trỏ đến một chuỗi null-chấm dứt.

0

Bạn có thể thay thế toàn bộ chuỗi:

char a[] = "4x^0"; 
int *b; 
b = new int[10]; 
char temp = a[0]; 
int temp2 = temp - 0; 
b[0] = temp2; 

với đơn giản:

char a[] = "4x^0"; 
int b = new int[10]; 
b[0] = a[0] - '0'; 

Không cần phải ở tất cả để mess về với các biến tạm thời. Lý do bạn cần sử dụng '0' thay vì 0 là vì trước đây là nhân vật '0' trong đó có một giá trị của 48, chứ không phải là giá trị 0.

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