0

現在、Windowsでセットアップするのが最も簡単なTCCを使用しています。解凍するだけで、準備が整います。しかし、私は他のコンパイラ、GCC、マイクロソフトが提供しているものなどを受け入れています。

私の問題は、サイズ16の整数配列への入力を検証する必要があることです。これが私のルールです:

if number is under 15 (including negative values) then input is valid
if number is under -2147483648 then -2147483648

if number is over 2147483647 then 15
else if number is over 15 then mod 16

if the number is a decimal, remove decimal point and validate again

私がCを使用していることを考えると、最後のポイントは私を怖がらせます、そして私は後でそれに戻ります。今のところ、私は最初の4つの条件を処理しようとしています。

私が遭遇している問題は、外側の境界をテストしようとすると、整数のオーバーフローが発生し、チェックが台無しになることです。そこで、検証のために入力を保持するために、longlongの一時配列を作成しました。すべてが正常に検証された瞬間に、整数の配列に収まるはずなので、(どういうわけか)long longを一時配列から実際の配列にコピーして、通常どおりプログラムを開始します。

私は長い間いじってやりたいことをやろうとしましたが、私のコードは速く乱雑になり、Cではすべてが非常に曖昧でマシンに依存しているので、何かがうまくいかないときはそれが私と私のくだらないコーディング、または私のマシンが他のすべてのマシンとは異なるという事実がエラーの原因となっています。この種のことは調査して解決できることを知っているので、私はそれに固執するつもりですが、あまり時間を無駄にしたくないので、SOに尋ねてショートカットがあるかどうかを確認します。

10進数の検証の部分私はアプローチの仕方についてさまざまなアイデアを持っていますが、私は希望がありません。あなたの意見は何ですか?

私がこれを行っている理由を知りたい人は誰でも:問題ではありません。この配列を必要とする高レベルの問題を非常に簡単に解決でき、すべての有効な入力で機能します。しかし、私は今ちょうど衒学者であるため、この質問です。

4

1 に答える 1

1

まず、あなたの状態にはいくつかの問題があります。数値が -2147483648 未満の場合、それも 15 未満であるため、チェックは一致しません (15 未満の数値は小数ではありません)。

strtol次に、 (check errnofor )でオーバーフローをチェックERANGEし、制限と比較できます (ただし、long が 32 ビットで 2 の補数である場合は必要ありません)。

小数に関しては、常に小数点を削除したい場合 (一連の他の条件が失敗した場合にそれを条件付けているため、必要だと言っているものではありません)、文字列からピリオドを削除する前処理ステップをセットアップできます。読み取りポインターと書き込みポインターの 2 つのポインターを使用して、インプレースで簡単に実行できます。

于 2011-11-19T15:48:34.430 に答える