Проверьте, является ли символ ASCII, используя битовые маски и битовые операторы в C - PullRequest
3 голосов
/ 11 февраля 2012

Мне нужно написать программу, которая будет проверять каждый отдельный символ из стандартного ввода, чтобы увидеть, является ли он символом ASCII. Я знаю, что нужно проверить, если 8-й бит (7-й в коде, если я правильно помню) равен 0, поскольку ASCII использует только 7 бит, но мне трудно понять, как именно заставить его проверить конкретный бит. Это то, что у меня есть на момент написания.

#include <stdio.h>

#define MASK 7

int     main(void)
{

auto    char    inChar;

    do
    {
    inChar = getchar();

    // Breaks the do-while loop if it detects End of File
    if (inChar == EOF)
        {
        break;
        }

    printf("%c", inChar);

    if ( inChar == (0 & MASK))
        {
        printf("Not an ASCII Character.\n");
        }

    }while(1);

    puts("\n");

    return 0;
}

Я знаю, что у меня пока нет должной реализации кодера для проверки каждого значения символа, но об этом я буду беспокоиться позже. Сейчас мне просто нужна помощь, чтобы он проверил этот конкретный бит в переменной.

Также я впервые спрашиваю здесь, поэтому, пожалуйста, простите за неправильное форматирование моего вопроса.

Ответы [ 5 ]

8 голосов
/ 11 февраля 2012

С ctype.h:

#define isascii(c)  ((c & ~0x7F) == 0)
3 голосов
/ 11 февраля 2012

Вы хотите седьмой бит, а не значение 7.

/* 10000000 = 2^7 = 128 */

uint8_t b;
printf("Leftmost bit is %d\n", (b & 128) != 0);
0 голосов
/ 11 февраля 2012

Не то, чтобы на этот вопрос еще не был получен хороший ответ, но я хотел бы добавить, что вы можете использовать битовую операцию сдвига .

bool is_printable( char c )
{
    return !( c & (1 << 7) );
}
0 голосов
/ 11 февраля 2012

Маска, которую вы хотите использовать, составляет 0x80.
При этом вы, возможно, захотите рассмотреть возможность использования ctype.h для проверки: http://linux.die.net/man/3/isascii

Кстати, ascii при включении расширенных кодов asciiравно 8 битам, иначе это 7 бит, но не все из них являются печатными символами.

Также inChar должен иметь тип int для хранения возвращаемого значения getchar ().Недопустимо вызывать printf, ожидая char и давая ему int.Сначала вы должны привести его к типу char, чтобы получить правильные типы.

0 голосов
/ 11 февраля 2012
(inchar & MASK) == MASK

вы проверяете, соответствует ли замаскированный шаблон исходной маске. И маска 0x80. Это будет верно, если у вас есть не ascii char.

...