【问题标题】:getchar() is not called when the program is executed via nvim in C在 C 中通过 nvim 执行程序时不会调用 getchar()
【发布时间】:2017-07-04 11:57:00
【问题描述】:

我是一名新手 C 程序员,目前正在根据书籍设计简单的程序以获取更多知识。 现在,我正在学习“C 编程语言”(Brian Kernighan,Dennis Ritchie),我正在讨论关于输入/输出编程的部分。

这是我尝试运行的代码(几乎完全来自 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. 为什么我尝试运行代码时 nvim 内部和外部的行为不同?
  2. 我应该在我的 C 代码或我的 nvim 宏中进行哪些更改才能在 nvim 中运行程序时获得预期的行为?

【问题讨论】:

  • 大概,当它失败时,您会在第一次调用时从getchar() 获得 EOF。这可能是打破feof(stdin) 以查看您是否收到EOF(例如,因为输入来自/dev/null)或一些错误的时候。循环之后,printf() 之前:if (feof(stdin)) printf("EOF\n"); else printf("Error\n");
  • @JonathanLeffler 在应用您的第一条评论中描述的更改后,我得到了 EOF 输出(不是错误输出)。对于“this answer:““%”后的“ foo),所以“%
  • 看来,出于某种原因,您的输入来自/dev/null 或等效文件,或其他一些空文件。奇怪的!我需要思考一会儿。你在 Linux 上吗? (我通过:help %&lt; 发现了%&lt; — 我应该先看看。注意这是一个向后兼容的hack;首选形式是%:r。但这对我来说是一个新功能,所以谢谢。)
  • 谢谢乔纳森。我在Linux上。我将对我的 vim 配置文件进行更改以反映首选形式。不应该改变任何事情,但无论如何都不会造成伤害。
  • 我想知道nvim 的意义是什么。这不太可能是您的麻烦的原因。我试图想出一种简单的方法来检测标准输入是否实际上是/dev/null 或其他东西。这可以通过fstat() 函数调用加上剖析它返回的内容(以及stat() 调用)来完成,但与我之前的建议不同,这并非易事。不是火箭科学,但不是微不足道的。您所看到的是出乎意料的——但不是您正在运行的 C 代码的错误。不知何故,这与nvim 有关。如果你输入 :!%:r 然后返回会发生什么?

标签: c vim user-input neovim


【解决方案1】:
  1. Neovim bang 字符引入了 EOF,如 here 所述。

  2. 更改 !在宏中由“te”。

【讨论】:

    【解决方案2】:

    在 gvim 中,:!gcc -Wall inputoutput.c -o inputoutput && ./inputoutput 为我工作并在下部屏幕中运行程序。

    不确定 nnoremap 在做什么,但必须引入一些控制字符。我通常不使用这样的编辑器重映射。建议编写一个 Makefile 并直接运行

    【讨论】:

    • 我直接在 nvim 中输入了命令(即没有使用带有 nnoremap 的快捷方式),但我仍然无法获得任何用户输入。一些额外的信息,我正在运行 nvim v0.2.0。我最终可以编写一个 Makefile 并使其工作。无论如何,我也可以直接在 nvim 之外编译。但为了方便起见,我想找到一种方法让这个工作正常。
    • 这不是答案,而是评论。实际上这是一个密切的原因:“无法复制”
    猜你喜欢
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2014-04-18
    • 2012-06-26
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多