nodejs中的C scanf等价物

时间:2013-01-09 15:04:30

标签: javascript node.js

如果我想从 C 的输入流中读取,我写scanf。, NodeJS 中是否有相同的方法来做同样的事情?

例如,这是 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
    }
});

3 个答案:

答案 0 :(得分:11)

对于初学者来说,在NodeJS中为可读流调用scanfdata事件并不等效。在NodeJS示例中,您将需要解析您收到的输入的块。

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

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

鉴于input如何包含您的数据,您需要使用某种方法来提取感兴趣的字符串,然后使用parseInt。对于您的问题,可能是一种天真的方法,假设每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事件循环的方法,我不是一个非常大的粉丝,您应该查看命令行参数,配置/输入文件或其他方法。

答案 1 :(得分:3)

检查sget

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

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

console.log('Area is', area);

答案 2 :(得分: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]