当前位置:   article > 正文

【JavaScript】解决华为机试代码在ide调试无法结束控制台输入问题_vscode node process.stdin.on 结束输入

vscode node process.stdin.on 结束输入

前言

在做华为机试的时候,代码模板用的是nodejs的标准输入process.stdin和输出process.stdon。在实现循环输入时,代码复制到本地ide调试会出现在控制台用尽方法都无法结束输入,导致调试失败。因为是mac电脑,window的ctrl+z或者ctrl+d都无效。


一、为什么?

先来看看华为的输入输出模板:

  1. process.stdin.resume();
  2. process.stdin.setEncoding('utf-8');
  3. let input = '';
  4. process.stdin.on('data', (data) => {
  5. input += data;
  6. });
  7. process.stdin.on('end', () => {
  8. let inputArray = input.split('\n');
  9. /**
  10. * 待实现函数,在此函数中填入答题代码
  11. * doFunc()
  12. */
  13. process.exit();
  14. });

代码理论上看起来没问题,有end函数,可以结束的。但是实际上无论输入什么,都无法触发输入的end。我们来看看官网上对stdin的定义:

文档说:当输入流接收不到任何字符的时候,它就会结束了!

好像很有道理的样子,但是为什么我就是无法结束!是不是针对我!

然后我就发现,为什么华为的input总是要split掉‘/n’?哦,想起来JavaScript的标准输入总是字符串格式,所以接收到的回车符也会转换成字符,那这样的话输入流里就一直在接收字符,肯定无法触发end事件了!

原来是这样!

那接下来就好办了,我只需要写一个判定,判断当前接收到的data如果只是一个回车符,那就手动触发end事件!

于是,只需要在input前面加上一个判定:

  1. process.stdin.on('data', (data) => {
  2. if (data === '\n'){
  3. process.stdin.emit('end');
  4. }else{
  5. input += data;
  6. }
  7. });

这样问题就解决了!大功告成!最后完整版华为JavaScript的ide调试模板如下:

  1. process.stdin.resume();
  2. process.stdin.setEncoding('utf-8');
  3. let input = '';
  4. process.stdin.on('data', (data) => {
  5. if (data === '\n'){
  6. process.stdin.emit('end');
  7. }else{
  8. input += data;
  9. }
  10. });
  11. process.stdin.on('end', () => {
  12. let inputArray = input.split('\n');
  13. /**
  14. * 待实现函数,在此函数中填入答题代码
  15. * doFunc()
  16. */
  17. console.log(/*你的答案*/);
  18. process.exit();
  19. });

直接复制放到ide就可以直接在ide里做华为机试题啦,写完直接复制dofunc里放进机考平台就可以了。


总结

JavaScript用来做机试真的太难了,真的要哭出来。输入格式总是各种坑,希望大家都能机试拿到高分!收获超级无敌多offer!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/242799
推荐阅读
相关标签
  

闽ICP备14008679号