在 C 中通过 nvim 执行程序时不调用 getchar()

getchar() is not called when the program is executed via nvim in C

我是一个新手C程序员,目前正在根据书本设计简单的程序以获取更多知识。 现在,我正在学习 "The C Programming Language"(Brian Kernighan、Dennis Ritchie),我正在点击讨论 input/output 编程的部分。

这是我正在尝试使用的代码 运行(几乎与 K&R 完全相同):

#include <stdlib.h>
#include <stdio.h>

int main (int argc, char** argv)
{
    int c;

    printf("Input character:\n");

    while ((c = getchar()) != EOF){
        putchar(c);
    }

    printf("End of code\n");

    return 0;

}

我使用 nvim 作为我的 IDE。我将我的 nvim 快捷方式设置如下用于编译:

nnoremap <leader>cc :!gcc -Wall % -o %:r && ./%:r<CR>

现在回到代码。当我使用上面显示的快捷方式编译这个时,它工作得很好。代码编译。但是,我的程序结束时没有询问我任何输入(调用 getchar() 应该这样做):

:!gcc -Wall inputoutput.c -o inputoutput && ./inputoutput

Input character:
End of code

直接在 nvim 中键入命令,不进行任何替换:

:gcc -Wall inputoutput.c -o inputoutput && ./inputoutput

给我和以前一样的输出。

但是,当我在外部 nvim 执行编译程序时,我得到了预期的行为:

nxr: ~/scratch/c - ./inputouput
Input character:
a
a
** <CTRL-d> **
End of code

nxr: ~/scratch/c -

我的问题是:

  1. 为什么当我尝试 运行ning 代码时,nvim 内部和外部的行为不同?
  2. 当 运行在 nvim 中运行程序时,我应该在我的 C 代码或我的 nvim 宏中更改什么以获得预期的行为?

在 gvim 中,:!gcc -Wall inputoutput.c -o inputoutput && ./inputoutput 对我有用,并且 运行 是屏幕下方的程序。

不确定 nnoremap 在做什么,但肯定有一些控制字符被引入。我通常不使用那样的编辑器重映射。建议写一个 Makefile 只做 运行

  1. Neovim bang 字符引入了一个 EOF,如解释的那样 here

  2. 改变!在宏中 "te".