C scanf эквивалент в nodejs

Если я хочу читать из входного потока в C , я пишу scanf ., Есть ли эквивалентный метод в NodeJS , чтобы сделать то же самое?

For example, here's the code in 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
    }
});
5
добавлено отредактировано
Просмотры: 2
nl ja de

3 ответы

Для начала вызов scanf и событие data </​​code> для читаемого потока в NodeJS не эквивалентны. В примере NodeJS вам нужно будет разобрать кусок введенного вами ввода.

Вы можете проверить, как эти куски будут отправлены вам, заменив тело вашего метода on простым:

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

Учитывая, как 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, вам следует искать аргументы командной строки, файлы конфигурации/ввода или некоторые другие способы.

11
добавлено
+1 отличный ответ, объяснение и советы по альтернативам
добавлено автор user633183, источник

Проверьте sget .

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

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

console.log('Area is', area);
3
добавлено

Эта функция будет выполнять то, что вы просили:

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] 
1
добавлено