4

Cで入力ストリームから読み取りたい場合は、次のように記述します。NodeJSscanfに同じことを行う同等の方法はありますか?

たとえば、Cのコードは次のとおりです。

int n,
    m,
    i;

scanf("%d", &n);

for (i = 0; i < n; i++) {
    scanf("%d", &m);

    ............

}

Node での開始点は次のとおりです... TODOは、行き詰まっている場所を示しています。

process.stdin.resume();
process.stdin.setEncoding("ascii");

process.stdin.on("data", function (input) {
    var n = +input;
    for (var i = 0; i < n; i++) {
        // TODO
    }
});
4

3 に答える 3

13

まず、NodeJS の読み取り可能なストリームの呼び出しscanfとイベントは同等ではありません。dataNodeJS の例では、受け取った入力のチャンクを解析する必要があります。

on メソッドの本体を単純なものに置き換えることで、これらのチャンクがどのように送信されるかを調べることができます。

process.stdout.write('onData: ' + input + '\n');

then にデータがどのように含まれているかを考えると、input何らかの方法を使用して目的の文字列を抽出し、 を使用する必要がありますparseInt。ごとに1つの整数を仮定すると、おそらくあなたの問題に対する素朴なアプローチinputです:

var n = 0;
var m = 0;
var state = 0;
process.stdin.on('data', function (input) {
    switch (state)
    {
    case 0:
        // we're reading 'n'
        n = parseInt(input.trim(), 10);
        state++;
        break;

    default:
        // we're reading 'm'
        m = parseInt(input.trim(), 10);

        if (state++ == n)
        {
            // we've read every 'm'
            process.exit();
        }
        break;
    }
});

私は、NodeJS イベント ループにデータを取得するこの手段の熱烈なファンではありません。代わりに、コマンド ライン引数、構成/入力ファイル、またはその他の手段に注目する必要があります。

于 2013-01-09T15:37:00.643 に答える
3

sgetを確認してください。

var sget = require('./sget');

var width = sget('Width?'),
    height = sget('Height?'),
    area = width * height;

console.log('Area is', area);
于 2014-10-25T03:47:30.620 に答える
2

この関数は、あなたが求めたことを行います:

function readNums(s) {
   // Split it up into numbers and spaces
   var array = s.split(/(\d+)/);

   // Keep just the numbers
   array = array.filter(function(i) {return "" + +i == i});

   // Convert back to a number
   array = array.map(function(i) {return +i});

   // How many elements should there have been?
   var maxLen = array.shift();

   if (array.length < maxLen) {
     throw "Not enough enough numbers";
   } else {
     array.length = maxLen;
   }


   return array; 
}

console.log(readNums("4 10 20 30 40 50 60 70"));

結果:

[10, 20, 30, 40] 
于 2013-11-07T23:04:11.667 に答える