0

このような一般的な情報要求で SO を煩わせて申し訳ありません。

非常に用語の多い vscanf の定義をたくさん見つけることができますが、関数から何が返されるかを示す具体的な例はあまり見つかりません。

http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frtref%2Fvscanf.htm

ただし、この例は1行の文字列入力のみを対象としていますが、同じことをしようとしていますが、複数行の.txtファイルから読み取っています。

fgets() を使用して一度に 1 行ずつ読み取ってから、vscanf を使用する必要がありますか? IBM infocenter の例のように、関数 vread() 内に配置して、関数内で使用する必要がありますか?

私は CS の 1 年生ですが、これは課題の質問ではありません。追加の作業を行って知識を広げようとしているだけで、まだ vread/vscanf を使用していません。

sscanf の使用に固執する必要がありますか? これがそれと同じくらい愚かである場合、私の謝罪。

PS 私は C を学ぶのが大好きです。この地球上で 31 年間学生として過ごした中で最も楽しかったことは、RSC の何人かとシェイクスピアのワークショップを行ったときです。

4

2 に答える 2

2

vscanf は、sscanf や fscanf ではなく、scanf に似ています。scanf は可変数の引数を取るのに対し、vscanf は可変引数リストへのポインターとして機能する va_list 引数を取るという点で、scanf とは異なります。vscanf の使用はまれです。ほとんどの場合、完全を期すためにあります (vprintf の使用がより一般的です)。vscanf の使用例として考えられるのは、さまざまな引数を持つ多数の scanf 呼び出しがあり、scanf がすべての引数を読み取ることができない場合に、そのたびに何らかのエラー アクション (同じエラー アクション) を実行する場合です。次に、scanf と同じように可変引数を取る scanf_and_check_for_error 関数を作成し、scanf の予期される戻り値である count 引数を追加し、引数リストを vscanf に渡し、その戻り値をチェックし、戻り値が間違っています。例えば、

void scanf_and_check(int count, char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    int rc = vscanf(fmt, ap);
    if (rc != count)
    {
        ErrorMessageBox("Bad input. This program employs a radical form of the fail-fast principle ... exiting!");
        exit(1);
    }
    va_end(ap);
}
于 2013-06-10T06:31:29.923 に答える
0

あまり役に立たないわけではありませんが、仕事に間違ったツールを試しているのではないかと思います. vscanf は、scanf ファミリーの「フロントエンド」を開発するときに使用することを意図しており、非常に「低レベル」のツールです。

おそらく fscanf を使いたいでしょう。本当にvscanfロジックを(すべてのva_list醜さで)使用したい場合は、vfscanfを見てください(例にリンクされています)

于 2013-06-10T05:35:28.693 に答える