在C语言中使用位掩码和位运算符来检查字符是否为ASCII

3

我需要编写一个程序,这个程序将检查标准输入中的每个字符,看它是否是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;
}

我知道我还没有完全实现编码器来检查每个字符值,但这是后话。现在我只需要帮助它检查变量中的特定位。

此外,这是我第一次在这里提问,请原谅我的问题格式不当。


无关: EOF 可能超出 char 类型的范围。使用 int 类型来存储 getchar() 返回的值。 - jfs
5个回答

8

来自ctype.h:

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

3

你需要的是第七位,而不是数值7。

/* 10000000 = 2^7 = 128 */

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

0

虽然这个问题已经得到了很好的回答,但我想补充一下,你可以使用位移操作

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

0
(inchar & MASK) == MASK

你正在测试掩码模式是否等于初始掩码。而该掩码为0x80。如果存在非ASCII字符,则结果将为真。


0

你想使用的掩码是0x80。
话虽如此,你可能要考虑使用ctype.h来进行检查: http://linux.die.net/man/3/isascii

顺便说一下,当包括扩展ASCII码时,ASCII是8位的; 否则它是7位的,但并不是所有的字符都可打印。

另外,inChar应该是int类型,以保存getchar()的返回值。 调用printf期望一个char而给它一个int是无效的。你应该先将其转换为char以获得正确的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接