fscanfのforループを使用して、ファイルからstructsの配列に5つの列を入力しています。各構造体には、1つの文字列と4つのint、最初のfscanfが文字列名を読み込んで格納します構造体の一部として、他の4つの入力整数を前記構造体(構造体の異なる変数全て)に入れる。通常の入力では正常に動作します。文字が整数列の1つに入力されると、scanfは0とその構造体の残りの値を入れ、charを新しい構造体のように使用します。つまり、その後ろのすべてをスキップし、不要なcharを名前として使用します行の残りの値を入力として使用します。 私の質問は、その入力によって生成された不要な構造体を無視する方法や、単にcharが認識され、特定のscanfがスキップされたことを単に防ぐ方法があるかどうかです。 私はスキャンの代わりにfgetsを使ってみましたが動作しませんでした。また、0を通常の値として入力できるので、不要な値をソートすることはできません。 私は理想的にはコードを見ていることが助けになると理解していますが、これは単色のためのものであり、それらの面会の会議を切望していないので、 ご質問ありがとうございました。 :)C fscanf入力の検証
答えて
あなたはそれが失敗した場合、それはもちろん
char name[100];
int value1;
int value2;
int value3;
int value4;
if (fscanf(file, "%99s%d%d%d%d", name, &value1, &value2, &value3, &value4) == 5)
success();
else
failure();
を失敗した指定子を超えてパラメータを変更していない、それはあなた次第何だ、それが成功したことを確認するためにfscanf()
の戻り値をチェックする必要がありsuccess()
実際にはfailure()
が実行されますが、そのようにして未定義の動作を防止します。
キーは、の行を意味する「入力5列」です。 fscanf()
を使用すると、行と同期するのは難しいです。特に、テキストを別の方法で解釈したい場合は、個別に読み込みと解析を処理するのに最適です。
char buf[100];
while (fgets(buf, sizeof buf, istream)) {
char s[sizeof buf];
s[0] = 0;
int i[4] = { 0,0,0,0 }; // default values
// c is the count of scanned variables
int c = sscanf(buf, "%s%d%d%d%d", s, &i[0], &i[1], &i[2], &i[3]);
printf("%d: %s %d %d %d %d\n", c, s, i[0], i[1], i[2], i[3]);
}
「が、文字はscanfのはそのため0を置く整数列の1つに入力されたとき、」そうfalseです。あなたが見ているのは前の値です。
短い答えは、fscanf
はこの仕事の間違ったツールです。
私は、これはあなたが読みたいファイルの一種である推測している:
だから、abc 1 2 3 4
def 5 6 7 8
ghi 9 10 11 12
あなたは方法のため、fscanf
を使用してこのデータを読み取るための完璧コードを持っていた場合でもfscanf
作品、お使いの
abc 1 2 3 4 def
5 6 7 8 ghi 9
10 11 12
テキストの書式設定行を読み込むためのより良い方法は、一度彼らにラインを読むことです:コードも完全に幸せに同じ3つのレコードを作成し、このgarbageyに見えるファイルを読んでいましたfgets
を使用して、各行をそのフィールドに分割します。
私は、私はいつもmain()
が受け取る同じように、argc
とargv
で空白で区切られた「言葉」にラインアップを壊すgetargs
と呼ばれる機能を使用しています。残念ながらgetargs
は標準ではありません。しかし、あなたが使用できるthese class notesに記載されているバージョンがあります。
標準ライブラリ関数strtok
を使用して、多かれ少なかれ同じことを行うことができます。 (あいにく私はstrtok
を使用しないので、残念ながらそれを行う方法を示すことはできません)
最後に、chuxが既に提案しているように、sscanf
を使用できます。あなたはこれを試してみて、それは "うまくいかない"と言ったが、もしあなたが私たちにもっと詳細を教えてくれたら、あなたがそれを働かせるように助けることができるかもしれない。
- 1. Cユーザー入力の検証 -
- 2. C++テンプレートの入力検証
- 3. C#テキストボックスの入力検証:float
- 4. 入力日付時刻の検証C#
- 5. ユーザー入力を検証する - Objective-C
- 6. jQueryの検証入力
- 7. React:入力検証
- 8. Matlab - 入力検証
- 9. Settings.bundle、入力検証
- 10. 複数の入力検証
- 11. PHPファイルの入力検証
- 12. Javaの入力検証メソッド
- 13. 入力の整数検証
- 14. 入力IDのJavascript検証
- 15. ユーザー入力の検証
- 16. javascript入力の検証
- 17. コンソール入力の検証
- 18. Hangmanユーザー入力の検証
- 19. PHPでの入力検証
- 20. Angular.Js入力[日]検証
- 21. Python - 複数入力検証
- 22. ベストプラクティス:入力検証(Android)
- 23. Collatz - 入力検証
- 24. Fueluxウィザード検証入力
- 25. 入力サニタイズVS検証
- 26. 手動入力とインポート入力のための角型検証
- 27. ユーザー入力検証とビジネスオブジェクトの検証混乱
- 28. XText検証 - 検証中に生の入力を取得する
- 29. jquery IE 8で入力の検証を検証しない
- 30. デフォルト値のテキスト入力のフォーム検証
'fscanf()'関数は、入力の検証に特別に使用するのが本当に難しいです。それは戻り値であることを読んだ。 –