2009-07-28 10 views
0

Cのバイナリファイルから情報を引き出していて、私の文字列の1つがGDBの\\b\\3777\\375\\v\\177として出てきています。私は非特定の方法で私の出力のこの種の無駄なデータを解析することができるようにしたい - 私は数字/文字で始まらないものは追い出される必要があります。これはどのように達成できますか?Cで不正な文字列を見つける

データは一度にnバイトの構造体にバッファされています。この情報は、ファイルの後のデータが正しく読み取られる方法に基づいて正しいと確信しています。

+2

バイナリファイルです。どうやってデータを読んでいるのですか?文字列を決めるのは何ですか? fgets()をループに入れているのですか、実際にはバイトのブロックをfread()で固定バッファに読み込んでそのバッファを処理していますか? –

+0

整数ではどういう意味ですか? –

答えて

2
 
if(isalnum(buf[ 0 ]) { 
    printf("%s", buf); 
} 
+3

あなたは負の数を信じていませんか? –

+0

isalnum()は質問に答えたとします。 '。'のチェックを追加するのは簡単です。と ' - '。 –

0

バイト単位で繰り返し、それぞれの値をチェックして、有効であると考えられる文字の1つを確認します。私はあなたが「整数またはchar」であることを考えるもの(すなわち有効な値を)知りませんが、あなたがに文字を比較してみてください(たとえば)のことを確認します。

(c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') 

上記の条件があることを保証します文字のASCII値は数字(0〜9)または大文字または小文字の英字のいずれかです。それから、あなたが望んでいないキャラクターに遭遇したときに、何をすべきかを決める必要があります。 「悪い」文字を「安全」なもの(空白のような)に置き換えることも、別のバッファに新しい文字列を作成して、「良い」文字だけを入れることもできます。

上記の条件は英語のみで機能し、アクセント記号付きの文字では機能せず、すべての句読点と空白も除外されます。可能性のある別のテストは、文字が印刷可能なASCII文字(句読点、スペース、CR/LFも含む(c >= 0x20 && c <= 0x7e) || c == 0xa || c == 0xd)かどうかを確認することです。これは、ASCII互換ではないエンコーディングに対処しようとする試みを始めていません。

+0

これは良い方法ではなく、 ''とその内容です。特に、あなたが 'setlocale()'を ''から呼んだ場合は、あなたが言及した問題に対処します。 –

0

これは、Linuxユーティリティstringsを再実装しているようなものです。与えられた各ファイルについて

、GNU列 印刷物の印刷可能な文字は、少なくとも4 長い文字(以下オプションで 所与の数)であり、印刷不能文字が続く である配列を含みます。 デフォルトでは、オブジェクトファイルの初期化されてロードされた セクションの文字列 のみを出力します。他の タイプのファイルの場合は、ファイル全体から という文字列を出力します。

0

ASCII印刷可能characteresの大半は0x20の範囲内にあるとおり(」」(〜 'チルダ)、スペース)が0x7Eに' あなたがこのテストを使用することができます。

if((buf[0] >= 0x20) && (buf[0] <= 0x7E)) 
{ 
    printf("%s", buf); 
} 

ASCII文字で始まる文字列を検証します。

関連する問題