我的程序应该让用户编辑一行文件。用户编辑该行并按Enter键将其发回。因此,我想打印即将被编辑的当前行,但是在stdin而不是stdout上打印它。 我不知道如何解决的唯一问题是我如何预先填充标准输入。我已经尝试过了:
char cprefill[] = {"You may edit this line"};
char cbuffer[100];
fprintf(stdin, cprefill);
fgets(cbuffer, 100, stdin);
这似乎是最简单的解决方案,但可能太简单了。 fprintf不会向stdin打印任何内容。什么是正确的方法?
它应该是这样的。请注意可以移动的光标。
答案 0 :(得分:3)
C语言没有终端或行版本的概念,因此无法以便携方式完成。您可以依靠像[n] curses这样的库来获得几乎可移植的解决方案,或者如果您只需要在一个操作系统上使用低级操作系统原语。
例如,在Windows上,您可以通过在读取之前将键击模拟到适当的窗口(例如通过发送WM_CHAR消息)来提供输入缓冲区,但这将非常不可移植 - 并且最终不再是C但是Windows解决方案......
答案 1 :(得分:1)
首先,您需要libreadline 开发人员包。 (如果您的系统上尚未提供libreadline
,则可能还需要{/ 1}}
在Debian / Ubuntu上apt install libreadline-dev
{加上libreadline6
如果您还需要二进制文件 - 6
可能在您的平台上有所不同)
然后您可以将历史记录添加到readline
,就像这样
#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>
...
char cprefill[] = {"You may edit this line"};
add_history(cprefill);
char *buf = readline("Line: ");
printf("Edited line is %s\n", buf);
// free the line allocated by readline
free(buf);
提示用户&#34;行:&#34;,并且必须执行向上箭头来获取和编辑历史记录,即cprefill
行。
请注意,您必须使用-lreadline
readline
打印作为参数给出的提示,然后等待用户交互,允许行编辑,并使用箭头加载存储在历史记录中的行。
然后释放char *
返回的readline
(因为该函数使用malloc()
分配缓冲区。)
答案 2 :(得分:0)
您可以使用GNU Readline。它会在启动时调用rl_startup_hook
指向的函数,在这里我们使用rl_insert_text
将文本放入行缓冲区。
#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>
int prefill(void)
{
rl_insert_text("You may edit this line");
return 0;
}
int main(void)
{
char *cbuffer;
puts("Please edit the following line");
rl_startup_hook = prefill;
if ((cbuffer = readline(NULL)) == NULL) /* if the user sends EOF, readline will return NULL */
return 1;
printf("You entered: %s\n", cbuffer);
free(cbuffer);
return 0;
}
有关更多信息,请参见GNU Readline manual。