2010-02-07 29 views
6

Được rồi, tôi đã nấu một số mã để đảo ngược các ký tự hex xung quanh như một phần của bài tập vui nhộn mà tôi đã tạo.Có gì sai với thuật toán của tôi?

Dưới đây là những gì tôi có vào lúc này:

#include <stdio.h> 
int main() { 
    char a,b,c; 
    while (1) { 
     c = getchar(); 
     if (!feof(stdin)) { 
      a = c % 16; 
      b = (c - a)/16; 
      c = (a*16) + b; 
      putchar(c); 
     }else{break;} 
    } 
return 0; 
} 

Nó hoạt động tốt cho hầu hết các giá trị. Ví dụ: 0xA0 trở thành 0x0A v.v ...

Tuy nhiên, nó không hoạt động tốt với các giá trị bắt đầu bằng 'F'.

0xF1 trở thành 0x10
0xFF trở thành 0xF0
vv ...

ai đó có thể điểm tôi vào đúng hướng?

+4

bạn cần khoảng không để toán học hoạt động. sử dụng int cho a và b chứ không phải char. Hoặc chuyển sang sử dụng các phép toán bitwise (>><< & và |) thay vì các phép toán. –

+0

@KennyTM: bạn có thể có nghĩa là 'putchar (cc >> 4 | (cc & 0xf) << 4); ' – mjv

+1

Như một lưu ý bổ sung: không cần phải trừ' a' từ 'c' trước khi chia cho 16.' b = c/16' sẽ cho bạn kết quả tương tự. Đây là cách phân chia số nguyên hoạt động trong C. – AnT

Trả lời

5

Bạn đang sử dụng loại dữ liệu đã ký (trên máy của bạn). Chuyển nó thành unsigned và nó sẽ hoạt động đúng.

+2

Bạn đã có giải pháp, nhưng lưu ý rằng 'char' có thể được ký hoặc unsigned tùy thuộc vào việc thực hiện. – AraK

+0

Thật vậy! Cảm ơn! Bây giờ, vì tôi sẽ không bao giờ tìm hiểu nếu tôi chỉ đơn giản là sử dụng nó. Bạn sẽ không bận tâm giải thích tại sao các vấn đề đã được ký kết trong char? Hoặc chỉ vào một số nguồn? – tangrs

+0

Bạn có thể nghĩ rằng đây là một liên kết quá chung chung, nhưng nó thực sự là một bài viết rất thú vị: http: //en.wikipedia.org/wiki/Integer_ (computer_science) –

7

Nếu char được ký trên hệ thống của bạn, thì khi nibble trên của c là f, c là âm và c% 16 sẽ cho kết quả âm.

0

Tôi không biết tại sao một người nào đó đang thực hiện thao tác *, /,% trong khi thao tác bitwise đơn giản có thể thực hiện những việc như vậy.

a = (c & 0x0F) < < 4;
b = (c & 0xF0) >> 4;
c = a | b;

+0

Khá ngược lại. Tôi không biết tại sao bất cứ ai sử dụng các hoạt động bitwise whnen arithmetics con người bình thường sẽ làm điều đó là tốt. – AnT

+0

Bởi vì đối với máy móc, chúng nhanh hơn 'mỹ phẩm bình thường của con người' – vrrathod

0

getcharputchar trả lại và mất int s. Thậm chí tốt hơn điều này, họ sử dụng giá trị của char truyền đến một unsigned char có nghĩa là đối với tất cả các ký tự hợp lệ putchar sẽ trả lại giá trị dương. Điều này là cần thiết cho thuật toán của bạn khi bạn sử dụng % và nếu không bạn sẽ cần phải dựa vào hành vi được xác định thực hiện.

Nếu bạn chỉ định giá trị getchar thành int thì bạn có thể kiểm tra xem đọc có thành công không vì bất kỳ lý do gì (không chỉ kết thúc luồng) bằng cách so sánh với EOF. Sử dụng feof là không cần thiết - trước đây chưa đủ.

Ví dụ:

int main(void) { 
    int c; 
    while ((c = getchar()) != EOF) { 
     /* algorithm goes here */ 
     putchar(c); 
    } 
    return 0; 
} 
Các vấn đề liên quan