数値変換指定子 および とは異なり、%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+B2
OK と を処理します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
(これが、も削除された理由です)。スキャン セットを使用すると、次のような入力を認識できます。表記法のため、文字または文字と数字の間にスペースを入れることができます (したがって、コードでは .col2
char col1[5]; char col2[5];
&
aAa1 + BbB2
%d
aaa 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 セル コンバーターも参照してください。