【发布时间】: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 -
我的问题是:
- 为什么我尝试运行代码时 nvim 内部和外部的行为不同?
- 我应该在我的 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 %<发现了%<— 我应该先看看。注意这是一个向后兼容的hack;首选形式是%:r。但这对我来说是一个新功能,所以谢谢。) -
谢谢乔纳森。我在Linux上。我将对我的 vim 配置文件进行更改以反映首选形式。不应该改变任何事情,但无论如何都不会造成伤害。
-
我想知道
nvim的意义是什么。这不太可能是您的麻烦的原因。我试图想出一种简单的方法来检测标准输入是否实际上是/dev/null或其他东西。这可以通过fstat()函数调用加上剖析它返回的内容(以及stat()调用)来完成,但与我之前的建议不同,这并非易事。不是火箭科学,但不是微不足道的。您所看到的是出乎意料的——但不是您正在运行的 C 代码的错误。不知何故,这与nvim有关。如果你输入:!%:r然后返回会发生什么?
标签: c vim user-input neovim