5

に十分な入力が得られるかどうかわからない場合がありますsscanfsscanf見つからない引数を台無しにしないと安全に想定できますか?

たとえば、このプログラムでは次のようになります。

#include <stdio.h>

int main(int argc, char** argv) {
    int a = 0, b = 0, c = 0;
    sscanf("1 2", "%d %d %d", &a, &b, &c);
    printf("%d %d %d\n", a, b, c);
    return 0;
}

出力は次のとおりです。

1 2 0

つまり、3 つの数字のうち 2 つを読み取り、最後の数字を台無しにしませんでした。この場合、すべてのコンパイラと標準ライブラリも最後の引数をそのままにしておくと安全に想定できますか、それとも次のようなことをする必要がありますか?

int main(int argc, char** argv) {
    int a = 0, b = 0, c = 0;
    if (sscanf("1 2", "%d %d %d", &a, &b, &c) != 3) {
        c = 0;
    }
    printf("%d %d %d\n", a, b, c);
    return 0;
}
4

5 に答える 5

3

7.21.6.2、パラ 21:

例 4:

    #include <stdio.h>
    /* ... */
    int d1, d2, n1, n2, i;
    i = sscanf("123", "%d%n%n%d", &d1, &n1, &n2, &d2);

値 123 が d1 に割り当てられ、値 3 が n1 に割り当てられます。%n は取得できないため
入力失敗の場合、値 3 も n2 に割り当てられます。d2 の値は
影響を受けます。値 1 が i に割り当てられます。

これは、対応する入力が利用できない場合にパラメーターが変更されないという保証に最も近いものです。

于 2013-09-17T20:22:56.957 に答える
3

C11で見つけることができる唯一の参照はfscanf、7.21.6.2/10用であり、次のように述べています。

変換の結果は、まだ変換結果を受け取っていない format 引数に続く最初の引数が指すオブジェクトに配置されます。

私は「配置された」を「割り当てられた」と解釈します。これは、一致した場合にのみ割り当てが発生し、そうでない場合は受信者変数が変更されないことを意味することを合理的な自信を持って言います。

もちろん、可変引数はすべて関数呼び出しの前に評価されることに注意してください。これは とは関係ありませんscanf

于 2013-09-17T20:07:22.750 に答える