1

scanf(...)関数の引数として使用できますか?このような:

printInteger(scanf(....));

scanf読み取った値を変数に関連付けるために使用できますか?このような:

n = scanf(...);

ps:ここで私がこれを求めている理由を説明しています。

この質問は私が知っている少し奇妙かもしれませんが、私はプロジェクトで働いています。プロジェクトでは、入力としていくつかの言語を受け取り、Cにコンパイルするコンパイラを開発しています。

たとえば、これは私の言語です。「stackoverflow」と呼びましょう;)

proc printInteger(integer k)
    integer i;
        begin
            for i = 1 to k do
                print i;
        end

proc main()
    integer n, i;
    boolean ok;
    begin
        printInteger(getInteger);
        n = getInteger;
        ok = true;
        while i < n do
            begin
                print i;
                i = i + 1;
            end
        if ok then print 1; else print 0;
    end

言語については詳しく説明しませんが、getIntegerつまり、を実行したいということです。つまりscanf(...)、表示されたときに、getIntegerとしてコンパイルしたいscanf(...)ので、いくつかの使用方法を知りたいと思いますscanf(...)

4

2 に答える 2

5

関数の引数としてscanf(...)を使用できますか?このような:

printInteger(scanf(....));

scanfを使用して、読み取った値を変数に関連付けることはできますか?このような:

n = scanf(...);

関数の引数として使用できますscanfが、両方の質問に対する本当の答えはノーです。スキャンされたデータを返さない、スキャンに成功したアイテムの数を返す、scanf または成功するEOF前に入力の終わりに達した場合走査。scanf値を受け取るために引数として渡すポインターを使用してスキャンされたアイテムにのみアクセスできます。したがって、関数に引数として渡すことはできscanfますが、それはあなたが望むように見えることをしません。

自分の言語で操作を実装したい場合getInteger、Cでは、この言語/操作がどのように機能するかを知っているのはあなただけなので、提案するのは困難です。を使用するだけscanfで、実装は次のようになります。

int nextInt;
int numScanned = scanf("%d", &nextInt);

if (numScanned < 1)
    handleError();
return nextInt;

ただし、言語の一般的な解析を行っている場合、使用するscanfことはお勧めできません。すぐにの制限に関する問題が発生し、scanf言語がないとすべての入力タイプを予測できなくなります。本当にシンプルで、あなたが含めた例よりもシンプルです。

これを適切に行うには、lexCに適したライブラリを見つけます。これにより、多くの頭痛の種を防ぐことができます。それ以外の場合、自分で字句解析を行う必要がある場合は、調べ始めfgets、入力から一度に1行ずつ取得し、自分でトークン化を行います。

于 2012-08-12T20:25:21.867 に答える
1

あなたが尋ねる:

このような関数の引数としてscanf(...)を使用できますか?

printInteger(scanf(....));

最初の質問に対する答えは「はい、でも...」です。

scanfを使用して、読み取った値をこのような変数に関連付けることはできますか?

n = scanf(...);

2番目の答えは「いいえ、なぜなら...」です。

「しかし」はほとんど「しかしそれはあなたが期待することをしないので、あなたがそうすることはめったにないでしょう」。

最初の例でscanf()は、成功した変換の(整数)数、またはEOFに達した場合はEOFを返します。読み取りたばかりの値を返すことはありません(特に、一般に、複数の値を読み取り、それらのほとんどが整数ではないためです)。したがって、変換された値の数を出力する場合は、printInteger()関数を使用して出力できますが、通常は出力しません。

scanf()同様に、2番目のケースでは、示されているようにの結果を整数に割り当てることができますn(エラーを報告する必要がある場合は、そうすることが賢明な場合がよくあります)。ただし、それは読み取られた値ではありません(%d変換仕様があると仮定します)。成功したコンバージョンの数です。

于 2012-08-12T21:03:45.377 に答える