数値変換指定子 および とは異なり、%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 セル コンバーターも参照してください。