• 締切済み

ファイルから漢字、数値を検索するプログラム

c言語の初心者です。今ひとつの難しい課題を解いているのですが、力 不足のため、行き詰っています。どうかお助けください>< 問題 テキストファイルから任意のコードを検索するプログラムを作る。 "@"の後の以下の条件にマッチした検索を行う @"漢字" "から始まった場合、文字列を検索 @0xff   "0x"から始まった場合、16進入力データを持つ位置を検索 0x1 = 0x01です。0x1という記述も許容する。 @255 "0"~"255"が入力された場合、入力データを持つ位置を検索。 但し、0~255までのチェックが必要。 @s65535 short(2Byte)単位で 65535(0xffff)を探す。 但し、0~65565までのチェックが必要 @s0xffff short(2Byte)単位で 0xffffを探す。 0xfff=0x0fffです 0x1や0xfffという記述も許容する @l1048575 long(4Byte)単位で 0x000fffffを探す。 @l0xffffffff long検索時の"@"の後は Lの小文字である。 これらを検索するプログラムはどうやって書けばよいかヒントのみでも 良いですから、アドバイスください。お願いします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

? @の次の文字が " なら文字列の検索, s なら 2byte単位, l なら 4byte単位, 0~9 なら 1byte単位で検索をするんですよね? このどれにあたるかわからない, ということ? まあ, 0 のときはちょっと面倒だけど, それ以外で問題になるとは思えないなぁ....

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

どれか 1つでもいいからできてますか? まさか「全部やってくれ」とかいうことはないですよね?

bokutyu
質問者

補足

漢字の検索はできています。 漢字と数値を別々に検索させるならできるのですが、 分からないのはどうやったら ”が入力されたら漢字、0xが入力されたら16進数、 0~255が入力されたら0~255の数値であると、 入力されたものがなにかを判別することができないんです。 プログラムではなくても、ヒントだけでもいいですので、 よろしくお願いします。

関連するQ&A

  • FAT12ファイルシステムに関する問題。

    タイトルに問題と書きましたが、課題や何かじゃないので咎めないでください。 FAT12でフォーマットしたFDにファイルを直接ディスクに書き込もうと思っています。 しかし、FAT16と違ってFATにクラスタ番号を書き込むのが難しいわけです。 環境はC言語で、アルゴリズムだけなので必要は無いかと思いますが、 Win32APIを使用できる環境です。 1.クラスタ番号は12bit長で 0x003 0x004 0x005 0x006 0xFFFをFATに書き込むと 03 40 00 05 60 00 FF 0F と記録されます。 2.ディスクへの書き込みは実装してあるためバッファへの書き込みが出来ればよい。 3.ディスクは初期化された状態で、0番と1番のテーブルは予約済み。2番からクラスタ番号を書き込むこととする。 4.一つのファイルを整列された状態で書き込むこと。初期化されているため、2番から後のテーブルは全て未使用。 5.クラスタサイズは1セクタ(512バイト)である。 6.書き込まれるファイルサイズは規定していないため、ループによる処理が望ましい。 7.ファイルサイズより必要なクラスタ数は求めてある。 typedef unsigned char byte; typedef unsigned short word, *pword; typedef unsigned long dword; byte fat[512];//FATへの書き込みバッファ 0クリアされている。 dword clust;//必要なクラスタ数 既に求めてある。 dword i;//インクリメント 自分で書いたFAT16用のFAT書き込みコード ((pword)fat)[0] = 0xFFF8;//0番目のクラスタ(予約) ((pword)fat)[1] = 0xFFFF;//1番目のクラスタ(予約) if (clust == 1) {//クラスタサイズが1なら     ((pword)fat)[2] = 0xFFFF;//最終クラスタを示す値を書き込む } else {//複数のクラスタに分割されるなら     for (i=0; i<clust-1; i++) {//クラスタサイズの-1個分までインクリメント         ((pword)fat)[i+2] = (word)i+3;//n番(2番から始まる)のクラスタにn+1のクラスタ番号を書き込んでいく     }     ((pword)fat)[i+2] = 0xFFFF;//最終クラスタを示す値を書き込む } 書きかけのFAT12 ((pword)fat)[0] |= 0x0FF0; *((pword)&fat[1]) |= 0xFFF0; if (clust == 1) {     *((pword)&fat[3]) = 0x0FFF; } else {     /*ここに1クラスタを超えたファイルのクラスタ番号をFATに書き込む処理*/ } どなたか、ヒントや情報をいただけると幸いです。 コードは書き直してもいいですし、変数も適当に名前付けて構いません。 他に必要な変数などがあれば追加してください。 また、補足要求があれば何なりとお書きください。 よろしくお願いいたします。

  • 以下のプログラムで出力が*adrs=9,0となるのはなぜでしょうか?

    以下のプログラムで出力が*adrs=9,0となるのはなぜでしょうか? for(adrs=(unsigned long *)0x1100;adrs<(unsigned long *)0x1200;adrs++){   sprintf(log_buff1,"*adrs=%d,%x",*adrs,adrs);   gotoxy(0, 0);   printf(log_buff1);   delay(50); }

  • ビット演算について

    以下のプログラムを作成して、int型、char型、long型のAND演算・OR演算の結果の違いを見ました。 実行結果からchar型だけ結果の表示の仕方が他と異なっています。 一般的に、バイト数では、 char(1バイト) < short(2バイト) < int(4バイト) のはずなのに、出力結果は、 char(0xffffffff) > short(0xff) = int(0xff) となっていて、charが一番大きく?、shortとintが同じ結果? のようにみえてしまいよくわかりません。 私は、ビット演算が苦手なので、根本的に考え方が間違っているのかも しれませんが、どうしてこのような出力結果となるのか教えてください。 プログラム #include <stdio.h> #include <stdlib.h> int main() { int xi = 0x7F, yi=0x80; int stri1 = xi&yi; int stri2 = xi|yi; printf("** int **\n"); printf("%p\n",stri1); printf("%p\n\n",stri2); char xc = 0x7F, yc=0x80; char strc1 = xc&yc; char strc2 = xc|yc; printf("** char **\n"); printf("%p\n",strc1); printf("%p\n\n",strc2); short xl = 0x7F, yl=0x80; short strl1 = xl&yl; short strl2 = xl|yl; printf("** short **\n"); printf("%p\n",strl1); printf("%p\n\n",strl2); return(0); } 出力結果 ** int ** 0x0 0xff ** char ** 0x0 0xffffffff ** short ** 0x0 0xff

  • ファイル操作について

    こんばんわ。 fopen関数を用いて、テキストファイル出力を行なっています。 fp = fopen("test.txt","a+"); のように、a+を用いれば、 X1・・・・・ X2・・・・・ X3・・・・・ と、書き込まれた内容が消去されずに書き込まれていきます。この場合、X1,X2,X3は、行単位で実行するたびに書き込まれていきます。 例えば、 X1[タブ]X2[タブ]X3・・・・・ と言うように、X1とX2の間にタブまたはスペースを挿入し、列単位で前回書き込んだ内容を消去せずにファイルへ書き込んでいく方法はありますでしょうか? よろしくお願い致します。

  • ゴーセン張りについて

    ゴーセン張りについてに教えて下さい。 16x19(スロート内グロメットホール6個のパターン)のラケットの場合において、ゴーセン張りではストリンギングのスタート位置(ショートサイドとロングサイドの中間位置)をラケットの中央2本のスロート側に取らず、トップのひとつロングサイド側から開始するというネット情報があるのですが、これは何故でしょうか。 ("ゴーセン張り"で検索していただくと容易にヒットすると思います。) 通常の一本張りとは違うのでショートサイド・ロングサイドのストリングの長さが違ってくることは理解しているのですが、何故スタート位置をこのズラした位置に持ってくるのか分からないのです。 このパターンのラケットであれば通常の一本張りのようにスロート側ど真ん中にショートサイドとロングサイドの境界を持ってきた方が分かりやすい気がするのですが・・・・。 当方通常の一本張り経験しかないのでどなたかご教授いただけると幸いです。

  • マイコンH8-3664 走行カー C言語プログラム改良

    SW0がONで3秒間前進して停止 SW0がOFFの後、再度ONで3秒間前進して停止  するプログラムです! これを、 3秒間前進後、3秒右旋回(右モーターのみ回転)後、3秒間前進、3秒右旋回を繰り返し、元の位置に戻るというプログラムに改良せよ!というのですが? /**************************************************************/ #include <stdio.h> #include <sysio.h> /*タイマーA*/ #define TMA (*((volatile unsigned char *)0xFFA6) /*割り込み*/ #define IENR1 (*((volatile unsigned char *)0xFFF4)) #define IRR1 (*((volatile unsigned char *)0xFFF6)) #define PDR8 (*((volatile unsigned char *)0xFFDB)) #define PCR8 (*((volatile unsigned char *)0xFFEB)) long count = 0; long x = 0; void interrupt timer( ) { IRR1 &= ~0x40 ; if( count == 300 ) { x = 1 ; count = 0 ; } else { count++; } } void main( ) { unsigned char a; TMA = 0x03 ; IENR1 |= 0x40 ; PCR8 = 0x0f ; while(1){ a = PDR8 >> 4 ; if( x == 0 && a == 0x0e ) { PDR8 = 0x0a ; _ei( ) ; } else if( x == 1 ) [ PDR8 = 0x00; _di( ) : if (( PDR8 >> 4) == 0x0f) { x = 0 ; } } } } /**************************************************************/ 尚、SW はプルアップされている!

  • TSPのプログラムについて

    パラメータを推計するためにTSPのプログラムを組んでいるのですが、 制約条件を設定する際のコマンドがわかりません。 OPTIONS CRT; FREQ N; SMPL 1 534; LOAD(FILE='C:\TSPEX\SUIKEI12.XLS'); FRML EQ P = B0+B1*LN(X1)+B2*LN(X2)+B3*L; PARAM B0 1.0 B1 B2 B3; LSQ(INST=(C X1 X2 L)) EQ; END; のプログラムに B0+B1+B2=1 という制約条件を入れたいのですが、どのようにしたらよいでしょうか。 よろしくお願いいたします。

  • 表の中から特定の数値を検索したい

    下記のような表の中があるとします。この中から、特定の部品を毎月、発注するために、Orderの数字を抽出するとします。 X1、X2、X3…部品番号です。各部品に、所要、注文(予定)、在庫の三項目がそれぞれぶら紐づいており、これが1000点くらいあるものとお考えください。 X1 Sep-09 Oct-09 Nov-09 Demand 1000 2000 3000 Order 5000 2000 2000 Inv 4000 7000 6000 X2 Sep-09 Oct-09 Nov-09 Demand 1000 2000 3000 Order 2500 4000 4000 Inv 1500 2000 3000 X3 Sep-09 Oct-09 Nov-09 Demand 1000 2000 3000 Order 2000 3000 4000 Inv 1000 1000 1000 さらに各部品にはMOQ(最小発注単位)が設定されており、 実オーダー時にはこの刻みによる計算が必要です。 例 MOQ X1 2500 pcs X2 2000 pcs X3 1500 pcs 部品番号と該当月だけを入力することで、Order数が検索され、なおかつMOQ刻みの計算(Roundupでよいです)が抽出される関数を求めたいです。 Hlookup、Vlookup、Match、Indexあたりをいろいろ触ってみましたが どれも完全にはカバーできません。 皆様のお知恵を拝借できますでしょうか?できれば数日以内にいただけますと大変助かります。

  • データ数値を16進文字列でprintfしたい。

    Microsoft Visual C++ 2010 Expressでプログラミングしています。 RecvBufという文字列に入った特定の位置の6バイトのデータを取り出したいと思っています。 それで、その6バイトには、TCP通信でアクセスしてきたクライアントのシリアル番号があるので、どのクライアントPCがつながってきたかを識別するため、その6バイト数値を16進数の文字列に変換してprintfで出力したいと思っています。 例えば RecvBuf[0x08] = 0x00 RecvBuf[0x09] = 0x11 RecvBuf[0x0a] = 0x22 RecvBuf[0x0b] = 0x33 RecvBuf[0x0c] = 0x44 RecvBuf[0x0d] = 0x55 というデータ数値が入っていた場合、これを文字に変換する方法はどのようにしたら良いでしょうか?

  • VBA 検索条件にヒットした行を削除

    VBAのことで教えてください。 エクセルのsheet1の「L列」に複数のデータが含まれております。 その中に「ロングタイプ」、「ショートタイプ」、「無償」など沢山のワードがある中で、 アスタリスク記号を利用して、5パターンのワードを検索して、その検索条件に満 たしている行を削除したいのですが、コードがわかりません。 例えば・・・・・ ロングタイプA ショートタイプB ロングタイプB ショートタイプA 無償A 無償B キャンペーンA キャンペーンB もっと複数のワードがあるのですが、その中でいらないワードをアスタリスク記号 を利用して5つワードを検索し、その対象行を削除したいです。 例えばアスタリスク記号を利用して「*ロング*」「*ショート*」「*無償*」などロングと 入っているワードを検索かけて、行を削除する。 コードで回答して頂ければ、幸いです。 宜しくお願いします。

専門家に質問してみよう