質問

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()を使用します。

ボーナス:入力の終わりのテストを解析から分離できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top