2012-02-16 6 views
2

私はscanfにスペースで区切られたいくつかの文字列を読み込まなければなりません。しかし、私はそれを読む必要がある文字列の数を事前に知っていませんが、1から5まではどこでもかまいませんが、入力に入力した後に読み込みを停止するようにscanfを設定することはできません。 %s %s %s %s %sをやってみましたが、ちょうど1〜2の単語を入力した後に入力しても想像できるように、それ以上の読み込みを期待していますし、%s%*[^\n]%s%*[^\n]%s%*[\n]%s%*[\n]%s%*[^\n]をしようとしました。それはどちらもうまくいかなかった。scanfオプションのマッチング

したがって、scanfにオプションの入力セクションを追加できるようにするにはどうすればよいですか。

ありがとうございました。

編集:私は、私はちょうどそれを解析するstrotk/sscanfその後、1行を読み取るためにfgetsを使用し、約scanfの

答えて

4

どのようにこれを行う方法があったかどうかを確認するために探していたはstrtokとfgetsを知っていますか?次に、ユーザーが入力した文字列の数を決定することができます。

+0

まあそれは私がそうする可能性が高いことです。私はこれのようにする方法があるかどうか疑問に思っていました。 – csteifel

+1

@legionよくあることかもしれませんが、 'scanf'を使うのは本質的に信頼性がありません。あなたは、ユーザーが何を入力するかについて多くのコントロールを持っていません。一方、 'fgets'を使うと、バッファ内のすべての文字列が得られます。途中で' scanf'を立てることなく、適切に解析することができます。 – cnicutar

3

scanfは、フォーマット文字列全体の読み取りを強制しません。入力が無効になったり入力が残ったりしないと、中断します。 http://www.cplusplus.com/reference/clibrary/cstdio/scanf/から

成功し

、機能が正常に 読み取り項目の数を返します。一致したエラーが発生した場合、このカウントは予想される読み取り数またはそれ以下の数に一致し、 もゼロになります。

次のコードは、scanf中に読み込まれた引数の数を示します:

char s1[10], s2[11], s3[11], s4[11], s5[11]; 
int read = scanf("%10s %10s %10s %10s %10s", s1, s2, s3, s4, s5); 
printf("Read %d strings", read); 

あなたがaaa bbb cccを入力してエンターキーを押した場合は、それはそれは4を印刷しaaa bbb ccc dddために、3を出力など