2

次の形式「foo=%d」で c の文字列を解析する必要があります。形式が正しいことを確認し、int 値を読み取る必要があります。

私の最初のコードは次のとおりです。

int foo_set = 0;
int foo;
if (sscanf(text, "foo=%d", &foo) == 1)
    foo_set = 1;

ただし、コードは「foo=5$%£」などの入力を拒否する必要があります。このコードは機能しますか?

int foo_set = 0;
int foo;
char control;
if (sscanf(text, "foo=%d%c", &foo, &control) == 1)
    foo_set = 1;

文字を使用してcontrol、コードは余分な入力がないことを確認します。これを行うためのより良い/より正しい方法はありますか?

ありがとう

4

1 に答える 1

9

フォーマット指定子を使用して%n、処理が終了した場所を特定し、それが文字列の長さと一致することを確認します。

const char* text = "foo=4d";
int pos;
int foo;

if (sscanf(text, "foo=%d%n", &foo, &pos) == 1 &&
    pos == strlen(text))
{
    /* Valid as all of text consumed. */
}

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

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

https://ideone.com/d1rhPfでデモを参照してください。

于 2012-12-04T11:18:32.613 に答える