我的算法出了什么问题?

时间:2010-02-07 07:15:02

标签: c algorithm math

好吧,我已经编写了一些代码来反转六角形字符作为我组成的有趣练习的一部分。

这就是我现在所拥有的:

#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;  
}  

适用于大多数值。例如,0xA0变为0x0A等......

然而,以“F”开头的值并不好。

0xF1变为0x10
0xFF变为0xF0
等...

有人能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:7)

如果你的系统上有char,那么当c的高半字节为f时,c为负数,c%16将给出否定结果。

答案 1 :(得分:5)

您正在使用签名(在您的计算机上)数据类型。将其切换为无符号,它应该可以正常工作。

答案 2 :(得分:0)

我不知道为什么有人在进行*,/,%操作,而简单的按位操作可以做这些事情。

  

a =(c&amp; 0x0F)&lt;&lt; 4;
  b =(c&amp; 0xF0)&gt;&gt; 4;
  c = a | b;

答案 3 :(得分:0)

getcharputchar返回并点击int。甚至比这更好,他们使用char施放到unsigned char的值,这意味着对于所有有效字符putchar将返回正值。当您使用%时,这需要您的算法,否则您需要依赖于实现定义的行为。

如果您将getchar的值分配给int,那么您可以通过与EOF进行比较来测试读取是否因任何原因(不仅仅是流末尾)而失败。那么使用feof就没有必要了 - 之前还不够。

E.g。

int main(void) {  
    int c;  
    while ((c = getchar()) != EOF) {  
        /* algorithm goes here */
        putchar(c);  
    }  
    return 0;  
}