使ってscanf("%s", u);
いるのでひもを取ります。文字、、、、、、、、、、、および整数を使用できますが、それ以外の場合は、プログラムにエラーメッセージq
を表示させc
ます。それが他の文字であるかどうかをどうやって知ることができますか。なぜなら、それら以外のものを入れると、それが文字列内の整数であると想定し、0に等しくなり、物事を台無しにするifステートメントに入るからです。-
+
/
*
%
^
=
atoi()
3 に答える
scanf形式指定子を使用して、無効な文字の1つに遭遇した瞬間に入力の受け入れを停止するようにする ことができます。%[...]
これにより、(文字の配列のように)格納する文字のセットを指定できます。セットに含まれていない文字が一致すると、変換が停止します。たとえば、%[0-9]は、「0から9までのすべての数値に一致する」ことを意味します。また、%[AD-G34]は、「A、DからG、3、または4に一致する」ことを意味します。
%[の直後にカレット(^)を置き、次のようにセットの後に続けることで、scanf()にセットにない文字を一致させることができます:%[^ AC]、これは「 AからCではありません。」
簡単に言えば、それscanf()
はこの仕事には間違ったツールです。おそらく検討する必要があります(またはPOSIX 2008fgets()
などの同等のもの)。readline()
これにより、行全体がメモリに読み込まれます。sscanf()
次に、有効なトークン(1つ以上の文字のシーケンス)とエラーを認識する他の「トークン化」メカニズムを使用して、文字列を解析できます。
なぜこれが無効な入力を受け入れるのですか?のコードを参照してください。入力行ごとに1つの数値を読み取る方法の例。あなたはそれをあなたの目的に適応させたいでしょう。現状ではあまり適切ではありませんが、数値解析の開始点としては適しています。atoi()
エラー検出を行わないことにも注意してください。非常に良性の環境(おそらく作業している環境など)にのみ適しています。
1つの代替方法は、常に文字列をスキャンしてループし、必要な条件を確認し、合格しなかった場合はエラーメッセージを送信し、それ以外の場合はそれを使用することです。入力は常にcharであるため、これが最も簡単な方法だと思います。