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 中可读流的调用scanfdata事件是不等价的。在 NodeJS 示例中,您需要解析收到的输入块。

您可以通过用简单的方法替换 on 方法的主体来检查这些块是如何发送给您的:

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

鉴于inputthen 如何包含您的数据,您需要使用某种方法来提取感兴趣的字符串,然后使用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 回答