如果我想从 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
}
});
答案 0 :(得分:11)
对于初学者来说,在NodeJS中为可读流调用scanf
和data
事件并不等效。在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]