Nppexec插件控制台输出顺序相反

时间:2019-05-31 16:42:02

标签: c notepad++

我使用nppexec将编译器快捷方式添加到notepad ++。 但是它的控制台工作有点奇怪。 它总是对需要输入的功能进行优先排序。

例如:

printf("First input:\n");
scanf("%d", &a);
printf("You typed %d");

控制台应打印“第一个输入” 得到我的意见, 并显示“您输入(输入)”

但是,它总是要求我键入所有输入 首先是scanfs。

所以控制台日志就像:

3
First input:
You typed 3

已编译的.exe文件以正确的顺序工作,但这有点烦人。

有人知道解决此控制台输出顺序的方法吗?

顺便

printf("First input:\n");
scanf("%d", &a);
printf("Second input:\n");
scanf("%d", &b);
printf("%d, %d", a, b);

此代码的控制台日志为

1
2
First input:
Second input
1,2

1 个答案:

答案 0 :(得分:0)

请在每个fflush(stdout);之后添加printf。 不幸的是,多年来在Windows中管道的实现中并没有改变这一点...

如NppExec手册所述(“ 4.5。控制台输出重定向”部分):

  

NppExec使用管道将子进程的输出重定向到NppExec的“控制台”窗口,并将用户的输入从NppExec的“控制台”窗口重定向到子进程的输入。这种方法有几个已知的局限性:

     
      
  • 在子进程结束之前可能不会显示任何输出(如果该子进程执行了大量操作而没有显式刷新其输出);

  •   
  • 子进程等待初始输入时,可能不会显示任何输出(某些解释器可能会发生这种情况,而cmd.exe不会发生这种情况);

  •   

NppExec手册还说(“ 4.8.2。附带脚本”部分):

  

printf(“%d \ n”,i);

     

fflush(stdout); //重要!否则输出可能会在管道内缓冲

     

有关管道内部可能存在缓冲的注释与NppExec有关-因为NppExec使用管道来重定向控制台进程的输出和输入。如前所述,现在我仍然要说,管道缓冲的这种“功能”不是NppExec注入或不正确处理的,它是管道的核心“功能”,因为它们是由Microsoft实现的。这已经知道了很多年了-仍然没有得到解决。因此,只要希望程序在没有真实控制台窗口的情况下运行(例如,在NppExec中运行),就应使用fflush()。