我需要编写程序来检查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;
}
我知道我没有正确执行编码器来检查每个字符值,但我稍后会担心。现在我只需要帮助它来检查变量中的特定位。
这也是我第一次问这里所以请原谅我的问题格式不正确。
答案 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) );
}