gpt4 book ai didi

c - 如何用反引号修复 initscr 错误?

转载 作者:太空宇宙 更新时间:2023-11-04 08:19:13 25 4
gpt4 key购买 nike

我对函数 initscr() 有一个真正的大问题。

#include <ncurses.h>
#include <stdlib.h>
#include <unistd.h>

int main(int ac, char **av)
{
WINDOW *win;

initscr();
printw("lol");
getch();
refresh();
endwin();
return (0);
}

当我编译这段代码并执行 ./a.out 时没问题,但是当我执行时

lol=`./a.out`

initscr 没有出现。我在 man 中读到关于函数 newterm 的内容,但它是一样的。

最佳答案

您可以使用 script 在终端上捕获任何命令的输出实用程序,通常默认安装。它将程序的所有输出保存到名为 typescript 的文件中,并且不会干扰程序。在 Linux 中,您可以按如下方式运行它:

script -c ./a.out

(对于其他系统,例如 OSX,您可能没有 -c 选项:script 没有 POSIX 标准)。

但是,您可能会发现结果出乎意料,因为它们会与转义序列混合。例如,在 TERM 设置为 vt100 的情况下运行程序,并使用 unmap 以可打印形式显示非打印字符。 ,我看到了这个:

Script started on Thu 03 Dec 2015 08:09:15 PM EST
\n
\E(B
\E)0
\E[1;40r
\E[m^O
\E[?7h
\E[H
\E[Jlol\r
\E[40;1H\r
\E[?1l
\E>
\nScript done on Thu 03 Dec 2015 08:09:16 PM EST
\n

一些程序(例如 dialog )并没有尝试将消息与转义序列分开,而是在使用标准输出进行屏幕更新时故意将消息写在标准错误上。或者(使用 newterm)您可以反转它,使获取消息变得简单。

这是使用该方法修改后的程序:

#include <ncurses.h>
#include <stdlib.h>
#include <unistd.h>

static void
show(const char *msg)
{
printw("%s", msg);
if (!isatty(fileno(stdout)))
puts(msg);
}

int
main(int ac, char **av)
{
newterm(NULL, stderr, stdin);
show("lol");
getch();
endwin();
return (0);
}

修改后的程序:

  • 使用函数 show 写入消息,该函数写入屏幕并可选择写入消息
  • 它使用isatty检查标准输出是否不是tty ,即您正在重定向程序的输出。如果没有检查,两者(输出和错误)都会被写入屏幕,把它弄乱。
  • 完成了一些小的清理工作:删除未使用的变量,以及不必要的 refresh 调用(因为 getch 已经这样做了)。

这个命令

lol=`./a.out`

将在不干扰屏幕更新的情况下完成对 lol 的请求分配。

关于c - 如何用反引号修复 initscr 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34072961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com