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のパスワード入力の検証
- 4. C++の入力検証とオーバーフロー
- 5. C#テキストボックスの入力検証:float
- 6. 入力日付時刻の検証C#
- 7. fscanfの使用:入力内の文字の検索
- 8. ユーザー入力を検証する - Objective-C
- 9. テストスコア - 入力検証
- 10. jQueryの検証入力
- 11. Settings.bundle、入力検証
- 12. Matlab - 入力検証
- 13. 検証が入力
- 14. 検証入力は
- 15. React:入力検証
- 16. 入力の検証angle2localization
- 17. 入力IDのJavascript検証
- 18. PHPでの入力検証
- 19. Javaの入力検証メソッド
- 20. javascript入力の検証
- 21. Python-ユーザ入力の検証
- 22. データ入力の検証
- 23. HTTP_RAW_POST_DATAの入力検証
- 24. 入力の検証 - Python
- 25. ユーザー入力の検証
- 26. PHPファイルの入力検証
- 27. 複数の入力検証
- 28. Laravel入力ファイルの検証
- 29. コンソール入力の検証
- 30. Hangmanユーザー入力の検証
'fscanf()'関数は、入力の検証に特別に使用するのが本当に難しいです。それは戻り値であることを読んだ。 –