2017-02-04 7 views
1

私は異なる命令を解析しようとしているアセンブリコードの行を持っています。 ここに私のテストファイルが文字列の部分文字列をsscanfと別々に読み取る方法

main: add  $s0,$s1,$s2 
     nor  $t0,$t1,$t2 
     addi $t0,$t1,50 

ARR [i]は.instでは、命令が移入され、タブが、それは各ライン上のアドレスです。だから、基本的に、それぞれがARR [i]が.instが追加たりとADDI

if ((sscanf(arr[i].inst, "%[add]add", temp) == 1) 
    printf("add"); 

が正常に印刷されます声明で始まるadd命令が現れるたびに "追加"。しかし、どうすればaddiからaddを読み込まないようにすることができますか?これらは、2つの命令であり、私はこの1つ下の文はADDIのためにテストし、私はコメントで述べたように

+1

あなたのコードは、入力に 'a'、' da'、 'dad'、' a'と 'd'の他のシーケンスが含まれている場合、' add'を表示します。書式文字列の末尾にある 'add'は決して一致しませんが、' sscanf() 'を呼び出す方法はありません。あなたはそれを間違ってやろうとしています。 ''%[a-z]」をスキャンし、その文字列とさまざまな選択肢を比較することを検討する必要があります。 'sscanf()'を各命令タイプごとにスキャンするのはよい方法ではありませんが、それはあなたが試みているようです。 –

+0

あなたはちょうど文字列を解析するための最良の言語を選択しました:C(そして私は痛いほどscanfの文字範囲を思い出しました:)) –

+0

'scanf(" add%* [\ t] ")'のようなものは、これは本当に正規表現の仕事だと思います。 –

答えて

2

それを印刷しますので、もし別の除外のaddi必要があります。

入力ならばあなたのコードはaddを印刷しますa,da,dad、およびaおよびdの他の配列を含む。フォーマット文字列内の末尾のaddは決して一致しませんが、sscanf()へのその呼び出しがあなたにそれを伝える方法はありません。あなたはそれを間違ってやろうとしています。 "%[a-z]"のスキャンを検討し、その文字列とさまざまな選択肢を比較する必要があります。 sscanf()を各命令タイプでスキャンするのは良い方法ではありませんが、それはあなたが試みているようです。

op-codesはすべて小文字で、いずれも19文字より長くなく、op-codeの文字はすべて基本的なラテンアルファベットであると仮定すると、

char opcode[20]; 

if ((sscanf(arr[i].inst, " %19[a-z]", opcode) == 1) 
{ 
    if (strcmp(opcode, "add") == 0) 
     printf("%s\n", opcode); 
    else if (strcmp(opcode, "addi") == 0) 
     printf("%s\n", opcode); 
    else if … 
} 
else 
{ 
    …handle error… 
} 

先頭のスペースが先頭のスペースをスキップします。 %[…]スキャンセット%cおよび%nは、先頭のスペースを自動的にスキップしない唯一の変換指定子です。

オペコードとして表示されている長すぎる名前を心配する必要があるかもしれません。 sscanf()で対処する方法がありますが、私はおそらくこの仕事にそれを使用していないでしょう。トークン化コードを使用したいと思います。 strtok_r()またはstrtok_s()を使用することができますが、私はstrtok()を使用しません。代わりにstrspn()を使用する可能性が高くなります。

オペコードの一致を検出するコードには深刻な作業も必要です。おそらくソートされた順序で有効なオペコード名のテーブルから駆動され、バイナリ検索がマッチを見つけるために使用されるべきです。オペコードの後に​​何が有効であるかを認識コードに伝えるために、そのテーブルに関連付けられた補足情報があるでしょう。

関連する問題