1

誰かが文字 ( ) を挿入しようとした場合にバッファをクリアするために使用されるnumberをscanf("%llu%c", &myUnsignedLong, &checkerNewLine)検証するために使用しています。>0 && <2^64checkerNewLinewhile (getchar() != '\n');

しかし、 のような負の数を挿入しようとすると-541231scanf成功して 2 が返されます (一致したパラメーターの数として)。明らかに に格納されている番号myUnsignedLongは ですが2^64-541231、それは私の意図ではありません。

これを解決する簡単な方法はありますか?どうもありがとう

4

1 に答える 1

4

仕様から (7.9.16.2):

ubase 引数の値が 10 の strtoul 関数のサブジェクト シーケンスに期待される形式と同じ形式の、オプションで符号付きの 10 進整数に一致します。対応する引数は、符号なし整数へのポインタでなければなりません。

入力はオプションで署名されることに注意してください。これは、コードがそのように動作する理由を説明しています。

ただし、このように指定されている理由については、適切な説明を提供できません。明確に定義された方法で符号なし変数に負の値を格納することはできないため、これが実際に未定義の動作を引き起こす可能性があると思います。

于 2013-10-20T12:20:51.637 に答える