0

次のいずれかのように、間に算術演算子を含む 2 つの数値を含む文字列を読み取っています。

A1 + B1
A1 - B1
A1 * B1
A1 / B1

A1 と B1 は読み取れますが、オペレーターは読み取れません。私はこれを使って読んでいます:

while (sscanf(matrix[i][c] + offset, "%c%d%*c%n",
       &col, &line, &readCharCount) == 2) {
  // do something
}

演算子を読み取るにはどうすればよいですか?

4

4 に答える 4

4

数値変換指定子 および とは異なり、%s変換%c指定子は空白をスキップしません。したがって、入力例を考えると%*c、演算子の前に空白を読んでいます。あなたは賢明に使うことができます:

while (sscanf(matrix[i][c] + offset, " %c%d %c %c%d", &col1, &row1, &op, &col2, &row2) == 5)
    ...data is OK...

オフセットを使用していて、スキャンが終了した場所をキャプチャしていたので、次を使用します。

while (sscanf(matrix[i][c] + offset, " %c%d %c %c%d%n",
              &col1, &row1, &op, &col2, &row2, &readCharCount) == 5)
    ...data is OK...

%n変換指定子はカウントされないため、テストは 6 ではなく 5 に対して行われることに注意してください。

また、フォーマット文字列内のスペースの慎重な配置にも注意してください。それらは必要かつ柔軟です (それはA1+B2OK と を処理しますA1 + B2)。より大きなスプレッドシートを許可する場合は、次のように指定することをお勧めします。

while (sscanf(matrix[i][c] + offset, " %4[a-zA-Z]%d %c %4[a-zA-Z]%d%n",
              col1, &row1, &op, col2, &row2, &readCharCount) == 5)
    ...data is OK...

ここで、 の型は単一から に変更されますcol1(これが、も削除された理由です)。スキャン セットを使用すると、次のような入力を認識できます。表記法のため、文字または文字と数字の間にスペースを入れることができます (したがって、コードでは .col2char col1[5]; char col2[5];&aAa1 + BbB2%daaa 999 + bbb 888

while (sscanf(matrix[i][c] + offset, " %4[a-zA-Z]%5[0-9] %c %4[a-zA-Z]%5[0-9]%n",
              col1, row1, &op, col2, row2, &readCharCount) == 5)
    ...data is OK...

型は現在char row1[6]; char row2[6];あり、アンパサンドは再び削除されています。その後、自信を持って を数値に変換できrow1ますrow2

列番号を対応するアルファベット コードに変換するコードについては、C の Calc セル コンバーターも参照してください。

于 2013-06-22T03:56:53.187 に答える
1

私が問題を理解していれば、間に 1 文字の 2 つの数字が表示されています。したがって、各数値をintformat string を使用して に読み取り、文字を format string を使用%dして文字列 (char[]配列)に読み取り%sます。

int nFirst;
int nSecond;
char op[5];  // operator, null, and some extra space to avoid overflow.

while (sscanf(matrix[i][c] + offset, "%d %s %d",
       &nFirst, op, &nSecond) == 3)

変数のアドレスを渡す必要がありますが、配列の名前は既にアドレスに解決されていることに注意してください。intchar[]

の戻り値は3 である必要があります。これは、変換されたアイテムsscanfの数が返され、3 つの変数を満たすことが期待されるためです。

于 2013-06-22T03:27:44.737 に答える
0

Adam の投稿は正しいと思いますが、+ とそれに続くオペランド番号の間にスペースがないと問題が発生します。

"%d%s%d" では、文字列 "1234 +5555" により %s が +5555 をキャッチします。

次のプログラムを作成しましたが、これはスペースの存在に関係なくオペランドを正しくキャッチします。ただし、変数 string には、空白を含む文字列が含まれる場合があります。[^0123456789 ] は「数字以外のすべての文字に一致する」ことを意味することに注意してください。

int main (int argc, char ** argv) {
    int a, b;
    char string[100];
    scanf ("%d%[^0123456789 ]%d", &a, string, &b);

    printf ("a = %d\n", a);
    printf ("str = %s\n", string);
    printf ("b = %d\n", b);
}

これが役立つことを願っています!

于 2013-06-22T04:04:21.313 に答える