我想编写NodeJS代码来解决像ICPC这样的问题。以下是使用www.hackerrank.com模板在JavaScript中提交的示例:
process.stdin.resume();
process.stdin.setEncoding('ascii');
var input_stdin = "";
var input_stdin_array = "";
var input_currentline = 0;
process.stdin.on('data', function (data) {
input_stdin += data;
});
process.stdin.on('end', function () {
input_stdin_array = input_stdin.split("\n");
main();
});
function readLine() {
return input_stdin_array[input_currentline++];
}
/////////////// ignore above this line ////////////////////
function main() {
var s = readLine();
s = s.split(",");
s = s.join(" ");
process.stdout.write(s);
}
我想离线编码,所以我需要在Windows控制台中运行程序。对于使用 C:users \ user>节点路径\ file.js 运行srcript我在代码末尾添加了行
main();
并且脚本运行,但它不处理标准输入。它给了我和“s = s.split()”中的错误,错误是以下“TypeError:无法读取属性'split'of undefined”。如果有人知道怎么做 node 处理标准输入请帮助我。
答案 0 :(得分:2)
您可以等待SIGINT
,只要输入流收到 CTRL + C 输入,就会发出SIGINT
事件,通常称为SIGINT
。如果在输入流收到SIGINT
时没有注册SIGINT
个事件侦听器,则会发出暂停事件。
收到SIGINT
后,系统会调用您的main()
函数,返回后,process.exit()
将关闭此过程。
所以不要等待结束事件
process.stdin.on('end', function(){
input_stdin_array = input_stdin.split("\n");
main();
});
你可以等待#SIG;'如下:
process.on('SIGINT', function(){
input_stdin_array = input_stdin.split("\n");
main();
process.exit();
});
答案 1 :(得分:1)
我建议您修改代码以附加到每行的数组,而不是创建一个长字符串然后拆分它。 e.g。
process.stdin.resume();
process.stdin.setEncoding('ascii');
var input_stdin_array = [];
var input_currentline = 0;
process.stdin.on('data', function (data) {
input_stdin_array.push(data);
});
process.stdin.on('end', function () {
main();
});
function readLine() {
if (input_currentline >= input_stdin_array.length) {
return "";
}
return input_stdin_array[input_currentline++];
}
/////////////// ignore above this line ////////////////////
function main() {
do
{
var line = readLine();
console.log("Line: " + line)
} while ((line||"") !== "")
}
另外,正如另一个答案所说,你想听'SIGINT'而不是'结束'。
我还建议使用Readline模块,如下所示:
var readline = require('readline');
var reader = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: true
});
var lines = [];
reader.on('line', function (line) {
lines.push(line);
});
reader.on('close', function (line) {
console.log('All done:');
console.log('Lines: ', lines);
});
您可以使用CTRL-D触发'关闭'。
答案 2 :(得分:1)
使用节点js
运行脚本node file.js
然后开始在控制台上输入您的输入。
一旦完成命中Cntrl + C并执行 SIGINT 过程中编写的代码。
在代码中进行了以下更改
process.stdin.resume();
process.stdin.setEncoding('ascii');
var input_stdin = "";
var input_stdin_array = "";
var input_currentline = 0;
process.stdin.on('data', function (data) {
input_stdin += data;
});
process.stdin.on('end', function () {
input_stdin_array = input_stdin.split("\n");
main();
});
process.on('SIGINT', function(){
input_stdin_array = input_stdin.split("\n");
main();
process.exit();
});
function readLine() {
return input_stdin_array[input_currentline++];
}
/////////////// ignore above this line ////////////////////
function main() {
var s = readLine();
s = s.split(",");
s = s.join(" ");
process.stdout.write(s);
}