Что не так с моим алгоритмом? - PullRequest
6 голосов
/ 07 февраля 2010

Хорошо, я приготовил некоторый код, чтобы поменять местами шестнадцатеричные символы как часть забавного упражнения, которое я составил.

Вот что у меня есть на данный момент:

#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 ]

7 голосов
/ 07 февраля 2010

Если char подписан в вашей системе, тогда, когда верхний клев c равен f, c отрицателен, а c% 16 даст отрицательный результат.

5 голосов
/ 07 февраля 2010

Вы используете подписанный (на вашем компьютере) тип данных. Переключите его на unsigned, и он должен работать правильно.

0 голосов
/ 07 февраля 2010

getchar и putchar возвращаются и принимают int с. Даже лучше, чем это, они используют значение char приведение к unsigned char, что означает, что для всех допустимых символов putchar вернет положительное значение. Это необходимо для вашего алгоритма, так как вы используете %, и в противном случае вам придется полагаться на поведение, определенное реализацией.

Если вы присваиваете значение getchar для int, то вы можете проверить, не удалось ли прочитать по какой-либо причине (не только в конце потока), сравнивая с EOF. Использовать feof тогда не нужно - раньше этого было недостаточно.

Е.Г.

int main(void) {  
    int c;  
    while ((c = getchar()) != EOF) {  
        /* algorithm goes here */
        putchar(c);  
    }  
    return 0;  
}
0 голосов
/ 07 февраля 2010

Я не знаю, почему кто-то делает операции *, /,%, тогда как простые побитовые операции могут делать такие вещи.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...