3

自動テストプログラムを作成しようとしているCでプログラムを書いています。I/O チャネル (stdin、stdout、および stderr) が「ブラック ボックス テスト モジュール」にリダイレクトされるプロセスが生成されます。2 つの数の乗算を含む単純なプログラムを想定してみましょう。この場合、テストするプログラムは次のようになります。

#include<stdio.h>
int main()
{
    int a, b, numTc, i = 0; //numTc being the number of test cases
    scanf("%d",&numTc);
    for(;i < numTc; i++)
    {
        scanf("%d%d",&a,&b); //Facing issue here
        printf("%d\n",a*b);
    }
}

ブラック ボックス テスト モジュールは、最初にこのプログラムの I/O チャネルをパイプにリダイレクトし、次にwrite()システム コールを使用して、最初にテスト ケースの数を書き込み、その後にテスト ケース自体を書き込みます。

私が直面している問題は次のとおりです。上記のように、2 番目の scanf でプロセスがハングします。入力バッファ全体を構築し、「\n」を追加した後にパイプに書き込むと、問題なく動作します。

ただ、機能は一つ一つ実現していきたいです。

ブラック ボックス モジュールのロジックは次のとおりです。

  1. データベースから合計テスト ケースを読み取る
  2. すべてのテスト ケースがスペースで区切られ、改行で終わる入力バッファーを作成します。
  3. このバッファを外部 (テスト対象プロセス) プロセスの stdin に書き込みます。
  4. テストされたプロセスからの出力を待ちます。

上記は正常に動作しています。ただし、ブラック ボックス モジュールは、テスト ケースを 1 つずつ記述できる必要があります。

4

2 に答える 2

2

隣同士にある 2 つの 1 桁の整数を読み取ろうとしていますか? もしそうなら、あなたは使用を検討するかもしれません%1d

あなたの入力の例があると役に立ちます。

于 2012-10-16T03:15:35.580 に答える
0

あなたの問題はおそらく、パイプへの標準 I/O が端末への標準 I/O とは異なる動作をすることです。端末への書き込み時には、デフォルトで行バッファリングされます。パイプへの書き込み時に完全にバッファリングされます。したがって、プログラムは実際にデータをパイプに送信するfflush(stdout);必要があります。printf()

厳密には、からの戻り値をチェックして、scanf()期待どおりの結果が得られていることを確認する必要があります。scanf()1 番目が 1 を返さない場合、または 2 番目が 2 を返さない場合は、問題があります。

おそらく、ログファイルを開いて何が読み取られているかを正確に確認することで、問題をデバッグできます。そのログ ファイルにも出力をフラッシュするようにしてください。

于 2012-10-16T03:12:23.247 に答える