【发布时间】:2020-06-06 23:37:23
【问题描述】:
我正在按照“构建你自己的 Lisp”教程来自学 C,并且遇到了一些与 fgets 相关的奇怪行为。这是我正在编写的章节的链接:http://www.buildyourownlisp.com/chapter4_interactive_prompt#an_interactive_prompt
代码是最终成为 REPL 的简单基础。它只是打印一些信息,然后启动一个循环来获取并打印用户输入。
#include <stdio.h>
static char input[2048];
int main(int argc, char** argv) {
puts("Brenlisp Version 0.0.0.0.1");
puts("Press Ctrl+c to Exit\n");
while (1) {
fputs("brenlisp> ", stdout);
fgets(input, 2048, stdin);
fputs(input, stdout);
}
return 0;
}
当我从 Bash 终端 (Windows 10) 运行可执行文件时,程序启动但没有向控制台打印任何内容,也没有接受/打印用户输入。
bschw@DESKTOP-92VUB1F MINGW64 ~/Projects/brenlisp
$ ./prompt.exe
但是,当我从 CMD 运行可执行文件时,提示按预期执行:
C:\Users\bschw\Projects\brenlisp>prompt.exe
BrenLisp Version 0.0.0.0.1
Press Ctrl+c to Exit
brenlisp> works fine
works fine
brenlisp> works fine
brenlisp> ^C
C:\Users\bschw\Projects\brenlisp>
另一个奇怪的事情是,当我在 WSL 上运行程序时,它不会在退出之前将“^C”字符串打印到控制台:
bschw@DESKTOP-92VUB1F:/mnt/c/Users/bschw/Projects/brenlisp$ ./prompt.exe
BrenLisp Version 0.0.0.0.1
Press Ctrl+c to Exit
brenlisp> works
works
brenlisp> works
brenlisp> bschw@DESKTOP-92VUB1F:/mnt/c/Users/bschw/Projects/brenlisp$
为什么这些程序的行为会根据它们从哪个 shell 运行而有所不同?如何让程序在 Bash 上正常运行?
【问题讨论】:
-
在打印后尝试
fflush(stdout);以(尝试)强制数据离开(最终)缓冲区。 -
谢谢!那行得通。我必须在第一次放入 while 循环之后立即将其放入 while (1) { fputs("brenlisp> ", stdout); fflush(标准输出); fgets(输入,2048,标准输入); printf("不,你是 %s", input); }
-
您可以使用
while (*input != '\n')代替while (1)退出循环,只需在"brenlisp> "提示符下按回车即可。您只需拨打 1 次电话puts而不是 2 次,例如puts("Brenlisp Version 0.0.0.0.1\nPress Ctrl+c to Exit\n"); -
另请注意,代表指针间接级别的
'*'(例如char** argv)通常与变量一起使用,而不是类型(例如char **argv)。为什么?char* a, b, c;当然没有声明三个指针,它声明了一个指针和两个字符变量。char *a, b, c;说明了这一点。
标签: c windows bash cmd windows-subsystem-for-linux