使用C中的Bitmasks和Bit Operators检查char是否为ASCII

时间:2012-02-10 21:14:18

标签: c char ascii bitmask

我需要编写程序来检查stdin中的每个char,看它是否是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 个答案:

答案 0 :(得分:8)

来自ctype.h

#define isascii(c)  ((c & ~0x7F) == 0)

答案 1 :(得分:3)

你想要第七位,而不是值7。

/* 10000000 = 2^7 = 128 */

uint8_t b;
printf("Leftmost bit is %d\n", (b & 128) != 0);

答案 2 :(得分:0)

(inchar & MASK) == MASK

您正在测试蒙版图案是否等于初始蒙版。掩码是0x80。如果你有一个非ascii字符,那将是真的。

答案 3 :(得分:0)

您要使用的MASK是0x80 话虽如此,您可能需要考虑使用ctype.h进行检查: http://linux.die.net/man/3/isascii

BTW,ascii当包括扩展的ascii代码时是8位 否则它是7位,但并非所有这些都是可打印的字符。

同样inChar应该是int类型以保存getchar()的返回值。 调用printf期望char并给它一个int是无效的。您应该首先将其强制转换为char以使类型正确。

答案 4 :(得分:0)

不是这个问题还没有得到很好的解答,但我想补充一点,你可以使用bit shift operation

bool is_printable( char c )
{
    return !( c & (1 << 7) );
}