繁体   English   中英

我的算法出了什么问题?

[英]What is wrong with my algorithm?

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

这就是我现在所拥有的:

#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
等等...

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

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

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

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

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

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

如果将getchar的值赋给int则可以通过与EOF进行比较来测试读取是否因任何原因(不仅仅是end-of-end)而失败。 因此没有必要使用feof - 之前是不够的。

例如

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM