"%n
を使用すると、前の部分スキャンが終了した場所からの文字列のスキャンを処理する通常の方法です。"%n"
は、そのポイントまでのスキャンのオフセットを記録します。
これをフォーマットの末尾に追加し、インデックス値が-1から変更されたかどうかをテストします。これは、シンプルで複雑なフォーマットで使用できます。
int scanf_buffer_2_step(const char * buffer) {
int i;
double d;
// Initialize to a value that a successful scan would never use.
int n = -1;
// append vv vv
sscanf(buffer, "Index:%d,%n", &i, &n);
// Test for success
if (n < 0) return 1; // fail
// Advance pointer to next string position
buffer += n;
// Do it some more
n = -1;
sscanf(buffer, " Data:%lf End of the line %n", &d, &n);
if (n < 0) return 1; // fail
buffer += n; // Advance pointer to next string position
if (buffer[0] != '\0') return 1; // fail (extra data)
printf("(%i %f)", i, d);
return 0;
}
int main(void) {
printf("%d\n", scanf_buffer_2_step("Index:1, Data:123.456 End of the line"));
printf("%d\n", scanf_buffer_2_step("Index:1, Data:123.456 End of the line extra"));
printf("%d\n", scanf_buffer_2_step("Index:1,"));
return 0;
}
最終スキャン用の出力
(1 123.456000)0
1
1
、'\n'
は、文字列の最後に許可されているように、" %n"
空白であれば追加することを検討してください。
fscanf()
の場合は、戻り値をEOF
にチェックするような問題が発生します。
'sscanf(string、...)'の代わりに単に 'sscanf(string + n、...)'を使います。 'n'は望む開始位置です。 –
私は 'n'、@MichaelWalzを持っていません。以前の呼び出しが終了した場所からsscanf()への新しい呼び出しを開始します。 – Arham
なぜあなたはあなたの質問でこれを求めなかったのですか? –