2


Number <-whitespace-> string <-whitespace-> optional_3rd_column のような行を持つファイルを読み取るために fscanf を使用しています

各列から数値と文字列を抽出したいが、3rd_column が存在する場合は無視する

データ例:
12 foo something
03 bar
24 something #randomcomment

12,foo; を抽出したいと思います。03、バー; 24、「何か」と「#ランダムコメント」を無視して何か

私は現在、次のようなものを持っています

while(scanf("%d %s %*s",&num,&word)>=2)
{ 
assign stuff 
}

ただし、これは 3 列目のない行では機能しません。2番目の文字列以降をすべて無視するにはどうすればよいですか?

4

4 に答える 4

11

問題は、%*s3 番目の列がない場合に次の行の数字を食べてしまい%d、次のトークンが数字ではないために次の行が失敗することです。gets()を使用せずに修正するにsscanf()は、指定された文字クラスを使用できます。

while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{ 
    assign stuff 
}

[^\n]、改行ではないできるだけ多くの文字に一致するように指示し、*以前のように代入を抑制します。%sまた、と の間にスペースを入れることはできないことに注意してください%*[\n]。そうしないと、フォーマット文字列のスペースが改行と%*[\n]一致し、 が後続の行全体と一致するため、これは望ましくありません。

于 2008-10-29T05:02:12.430 に答える
4

fgets() を使用して一度に 1 行を読み取り、次に sscanf() を使用して関心のある 2 つの列を探します。より堅牢であり、末尾のデータを無視するために特別なことをする必要はありません。

于 2008-10-29T04:36:27.537 に答える
4

最も簡単な解決策は、scanf("%d %s", &num, &word) を実行してから fgets() を実行して残りの行を処理することです。

于 2008-10-29T04:44:27.830 に答える
0

私はよく gets() の後に sscanf() を使用して、取得したばかりの文字列を処理します。

おまけ: 入力の終わりのテストを解析から切り離すことができます。

于 2008-10-29T04:37:13.760 に答える