質問
fscanfを使用して、
のような行を持つファイルを読み取ります
番号<!> lt; -whitespace-<!> gt;文字列<!> lt; -whitespace-<!> gt; optional_3rd_column
各列から数字と文字列を抽出したいが、3rd_columnが存在する場合は無視する
サンプルデータ:
12 foo何か
03 bar
24何か#randomcomment
12、fooを抽出します。 03、bar; 24、<!> quot; something <!> quot;を無視しながら何かおよび<!> quot; #randomcomment <!> quot;
現在、次のようなものがあります
while(scanf("%d %s %*s",&num,&word)>=2)
{
assign stuff
}
ただし、これは3番目の列がない行では機能しません。 2番目の文字列以降をすべて無視するにはどうすればよいですか?
解決
最も簡単な解決策は、scanf(<!> quot;%d%s <!> quot ;, <!> amp; num、<!> amp; word)、次にfgets()行の残りを食べます。
他のヒント
問題は、3番目の列がないときに%*s
が次の行の数字を食べて、次のトークンが数字ではないため次の%d
が失敗することです。 gets()
の後にsscanf()
を使用せずに修正するには、指定された文字クラスを使用できます:
while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{
assign stuff
}
[^\n]
は、改行ではないできるだけ多くの文字に一致することを示し、*
は以前と同様に割り当てを抑制します。また、%s
と%*[\n]
の間にスペースを入れることはできないことに注意してください。そうしないと、フォーマット文字列のスペースが改行と一致し、<=>が後続の行全体と一致します。あなたが欲しい。
fgets()を使用して一度に1行を読み取り、次にsscanf()を使用して関心のある2つの列を探します。より堅牢で、後続データを無視するために特別なことをする必要はありません。
私は、gets()に続いてsscanf()を使用します。
ボーナス:入力の終わりのテストを解析から分離できます。