33

私は文字列 (a char*)sscanfを解析しています。次のように、文字列から数値を double に解析するために使用しています。

// char* expression;
double value = 0;
sscanf(expression, "%lf", &value);

これはうまく機能しますが、従来の方法で文字列の解析を続けたいと思います。sscanf新しいオフセットから手動で解析を再開できるように、解析された文字数を知る必要があります。

明らかに、最も簡単な方法は、解析する文字数を何らかの方法で計算することですsscanfが、それを行う簡単な方法がない場合は、別の二重解析オプションを使用できます。ただし、高速でシンプルで読みやすいため、現在使用しています。いずれにせよ、double を評価し、その後も解析を続ける方法が必要なだけです。sscanf

4

2 に答える 2

51

フォーマット指定子を使用して%n、追加のint *引数をsscanf()次のように指定できます。

int pos;
sscanf(expression, "%lf%n", &value, &pos);

nC99 標準の書式指定子の説明:

入力は消費されません。対応する引数は、関数へのこの呼び出しによってこれまでに入力ストリームから読み取られた文字数が書き込まれる符号付き整数へのポインタでなければなりませんfscanf。ディレクティブを実行%nしても、関数の実行完了時に返される割り当てカウントはインクリメントされませんfscanf。引数は変換されませんが、1 つが消費されます。変換指定に代入抑止文字またはフィールド幅が含まれている場合、動作は未定義です。

の戻り値を常にチェックしてsscanf()、割り当てが行われたことを確認し、後続のコードが値が変更されていない変数を誤って処理しないようにします。

/* Number of assignments made is returned,
   which in this case must be 1. */
if (1 == sscanf(expression, "%lf%n", &value, &pos))
{
    /* Use 'value' and 'pos'. */
}
于 2012-11-21T22:32:57.307 に答える
4
int i, j, k;
char s[20];

if (sscanf(somevar, "%d %19s %d%n", &i, s, &j, &k) != 3)
    ...something went wrong...

変数には、格納されている整数の末尾がスキャンkされたポイントまでの文字数が含まれます。j

%nは成功したコンバージョンにはカウントされないことに注意してください。%n必要に応じて、フォーマット文字列で複数回使用できます。

于 2012-11-21T22:35:20.837 に答える