2012-02-10 6 views
3

stdinからの個々の文字がASCII文字かどうかを確認するプログラムを作成する必要があります。私はチェックする必要があることを知っているのは、ASCIIが7ビットしか使用していないので、8番目のビット(コードでは7番目が正しく覚えていれば)は0ですが、特定のビット。これは私が執筆の時点で持っているものです。C言語でBitmasksとBit Operatorsを使用してcharがASCIIであるかどうかをチェック

#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

:EOFは 'char'値の外にある可能性があります。 getchar()の戻り値を格納するにはint型を使います。 – jfs

答えて

3

あなたは値7

/* 10000000 = 2^7 = 128 */ 

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

は、マスクされたパターンをマスク当初等しい場合、あなたがテストしている、7ビット目をしませ欲しいです。マスクは0x80です。これは、ASCII以外の文字がある場合に当てはまります。

8

ctype.hから:

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

使用したいマスクが0x80です。 http://linux.die.net/man/3/isascii

ところで、拡張ASCIIコードを含むASCIIは8ビット で、それ以外の場合は7ビットであり、すべてではなく、それらのは、次のとおりです。あなたがチェックをするためにのctype.hを使用して検討する必要があります言われていること
印刷可能な文字。

また、getCh()の戻り値を保持するには、inChar型がint型である必要があります。 これは、printfがcharを予期してintを与えることを呼び出すことができません。正しい型を取得するには、最初にchar型にキャストする必要があります。

0

まだこの質問にはうまく答えられていませんが、私はbit shift operationを使用できると付け加えたいと思います。

bool is_printable(char c) 
{ 
    return !(c & (1 << 7)); 
} 
関連する問題