Javascript 如何在控制台中处理标准输入节点?
我想写NodeJS代码来解决像ICPC这样的问题。以下是使用www.hackerrank.com模板以JavaScript提交的示例:Javascript 如何在控制台中处理标准输入节点?,javascript,node.js,Javascript,Node.js,我想写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) {
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>node path\file.js运行srcript,我在代码行末尾添加了
main();
脚本运行,但不处理标准输入。它在“s=s.split()”中给出了错误,错误是下面的“TypeError:无法读取未定义的属性'split'。如果有人知道如何处理标准输入,请帮助我。您可以等待
SIGINT
,只要输入流接收到CTRL+C输入,就会发出SIGINT
事件,通常称为SIGINT
。当输入流接收到SIGINT
时,如果没有注册SIGINT
事件侦听器,则将发出暂停事件
当收到SIGINT
时,将调用main()
函数,返回后,process.exit()
将关闭该进程
因此,与其等待结束事件
process.stdin.on('end', function(){
input_stdin_array = input_stdin.split("\n");
main();
});
您可以按如下方式等待“SIGINT”:
process.on('SIGINT', function(){
input_stdin_array = input_stdin.split("\n");
main();
process.exit();
});
我建议您修改代码,将每行追加到一个数组中,而不是创建一个长字符串然后拆分它。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’而不是‘end’
我还建议使用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触发“关闭”。- 首先运行此代码,将文件保存在扩展名为.js的任何位置
- 使用命令提示符,转到该文件夹
- 使用节点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); }