是否可以在C中同时使用printf()和ncurses函数?

问题描述 投票:0回答:2

我正在尝试以ncurses打印ASCII扩展表之外的字符,但是printw()仅支持8位长的可打印字符。但是printf()允许您打印8位以上的字符。我想使用诸如move()之类的ncurses函数来移动光标的位置,同时还要使用printf()来打印出8位以上的字符。

有几种解决此问题的方法。

1]以某种方式允许在ncurses模式下输出8位以上的字符。这包括printw(),addch(),wprintw()等。我之前曾就此主题问过一些问题,但效果有限。我的Ubuntu编译器中的addch()将输出8位以上的some ASCII值,但不是全部。诸如

的功能
addch(ACS_S1); addch(ACS_LANTERN);

不打印出字符,而是打印出

2)让printf()与ncurses函数(例如move()和init_color())同时工作,以便我可以打印8位以上的字符。我遇到这个问题的原因是因为当您在ncurses中使用refresh()时,它将清除底部屏幕,将其替换为您正在使用的窗口。 printf()被根除,或者不能与move()一起使用。我认为可能有一个在特定窗口上移动光标的移动功能,在那种情况下,我也许可以移动打印,但是我不知道该功能,也不知道printf所在的屏幕

如果这是问题的一部分,我正在使用Ubuntu。我不认为是,但是我只是将其包含在内。任何帮助将不胜感激。

c printf ncurses
2个回答
0
投票

[[ncurses中关于字符集和Unicode支持的任何混淆,都存在且完全可用]:

代替curses函数,您可以使用较低级别的tputs(.., putchar),因为它使用的是stdio putchar来编写转义符,因此可以自由地与其他stdio函数(例如printffwrite)混合使用。

示例,使用cc ... -ltinfo进行编译:

#include <stdio.h>
#include <term.h>
#include <err.h>

int main(void){
        char *cup;
        if(setupterm(0, 1, 0))
                errx(1, "setupterm failed");
        if(!(cup = tigetstr("cup")))
                errx(1, "no cursor addressing in terminal");
        tputs(tigetstr("smcup"), 1, putchar);

        tputs(tiparm(cup, 13, 13), 1, putchar);
        printf("HELLO");        /* or whatever you like */
        getchar();

        tputs(tigetstr("rmcup"), 1, putchar);
}

0
投票

问题说:

我正在ncurses中打印ASCII扩展表之外的字符,但是printw()仅支持8位长的可打印字符。

实际上,ncurses的ncursesw库(通常从​​2002开始可用)处理多字节字符(例如UTF-8),因此printw处理如下字符串:

char *foo = "  { 0x04a6, 0x30f2 }, /* kana_WO ヲ KATAKANA LETTER WO */";
printw ("%s", foo);

它不会像您期望的那样解释这种事情:

wchar_t foo = 0x04a6;
printw ("%c", foo);

因为底层的C运行时将坚持%c引用char,而不是wchar_t。所有这些都依赖于初始化语言环境并使用正确的库。

当然可以混合使用stdio和curses,但这不能解决您所要解决的问题(要成功完成此操作需要一些工作)。我已经在ded(目录编辑器)中完成了大约30年的工作,使用部分屏幕显示诅咒,部分显示不显示诅咒。

© www.soinside.com 2019 - 2024. All rights reserved.