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;
}

我知道我还没有正确实施编码器来检查每个字符值,但我稍后会担心。现在我只需要帮助它检查变量中的特定位。

这也是我第一次在这里提问,所以请原谅我的问题格式不正确。

4

5 回答 5

8

来自ctype.h

#define isascii(c)  ((c & ~0x7F) == 0)
于 2012-02-10T21:19:55.907 回答
3

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

/* 10000000 = 2^7 = 128 */

uint8_t b;
printf("Leftmost bit is %d\n", (b & 128) != 0);
于 2012-02-10T21:16:20.957 回答
0

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

顺便说一句,包含扩展 ascii 代码时的 ascii 为 8 位,否则为 7 位,但并非所有这些都是可打印字符。

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

于 2012-02-10T21:26:28.980 回答
0

并不是说这个问题还没有得到很好的回答,但我想补充一点,你可以使用位移操作

bool is_printable( char c )
{
    return !( c & (1 << 7) );
}
于 2012-02-11T12:01:58.547 回答
0
(inchar & MASK) == MASK

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

于 2012-02-10T21:18:39.493 回答