質問: データファイル内の文字列を削除する 私は、.datファイルの正方行列と別の.datファイルのベクトルを読み込み、2つを増やしてガウスジョルダン消去を行い、拡張行列を行を減らした逐次型にするコードを書いています。私は今、ユーザーの入力が無意味である場合、それをユーザーフレンドリーにしてエレガントにクラッシュさせるようにしています。たとえば、行列が正方形であり、ベクトルの長さが行列の次元と一致することを確認するチェックがあります。私が今しようとしているのは、数字でないデータファイルに文字や記号があるかどうかを確認することです。 私の試み: `scanf( "%lf"、)`のようなものは、これらのシンボルのいずれかに遭遇したときに停止するという点で機能します。問題は、私の入力がコマンドラインからではないということです。 (コマンドラインは実際にはオプションではありません。なぜなら、ユーザがそこに座ってコマンドラインで入力したくない巨大な行列をコードが受け入れることができるようにするためです)。 fscanf( "%f"、)を実行すると、文字列に遭遇するとナットになります。 scanfのようなものがありますか?それは文字を見つけたときにただ止まりますが、狂っていませんか? そうでない場合は、他の提案はありますか?
回答: `fgets` を使用して、事前に割り当てられたバッファに行を取得し、次に `strtoX` を使用して浮動小数点数を抽出します。 `float` の場合は `X` = `d` = `f` `long double` に、 `X` = `そのシグネチャは対応するタイプ(` float 、 `X_t` )であり、X_t strtoX(const char * nptr、char ** endptr) double 、または `long double` )。 行の終わりに達するまで( `** endptr = '\ n'` )、行ポインタを増やします(プリアロケートされたバッファを指すように設定されます。 > strtoX に移動し、isが実行されるまでインクリメントします。 次のように2つの変数を使用します。 ``` char *lp = buf; char *lp2 = buf; do { X_t x = strtoX(lp, &lp2); if (lp == lp2 && *lp != '\n') { ++lp; continue; } if (*lp2 == '\n') goto read_line; //do something with x } while (1); ``` 私のコードは素晴らしいことではありませんが、その点を示すべきです。 また、 `X` = `f` と `X` = `ld` の `strtoX` C99/POSIX 2011まで。