printw()不会从uint8_t数组中打印单个字符

时间:2015-05-13 17:16:38

标签: c ncurses curses pdcurses

这是我的main()代码:

#include <stdio.h>
#include <stdlib.h>
#ifdef __gnu_linux__
    #include <ncurses.h>
#endif
#ifdef _WIN32
    #include <curses.h>
#endif
#include "terminal_info.h"
#include "interface.h"
int main()
{
    initscr();
    setvbuf(stdout, NULL, _IONBF, 0);
    testForUI();
    readUIFile();
    continuouslyUpdateInfo();
    refresh();
    printDocument();
    getch();
    endwin();
    clearAll();
    return 0;
}

我在printDocument()

中遇到的问题
void printDocument()
{
    int counter = 0;
    printw("Document Size: %d\n", documentSize);
    for(counter = 0; counter < documentSize; counter++)
    {
        printw("%c",(char)document[counter]);
        refresh();
    }

}

在for循环开始时,gdb说文档的内容如下:

$1 = (uint8_t *) 0x3e32c0 "<Root>\r\n    <Hello>World</Hello>\r\n    <This>\r\n
<Is>:-)</Is>\r\n        <An>:-O</An>\r\n        <Example>:-D</Example>\r\n    </This>\r\n</Root>\r\n««««««««_î_î_"

但程序只打印:

Document Size: 123

但是,如果我将printw语句更改为:

printw("%c - %d",(char)document[counter], document[counter]);

我明白了:

Document Size: 123

 - 13
 - 10  - 32  - 32  - 32  - 32< - 60H - 72e - 101l - 108l - 108o - 111> - 62W - 8
7o - 111r - 114l - 108d - 100< - 60/ - 47H - 72e - 101l - 108l - 108o - 111> - 6
 - 13
 - 13
 - 10    - 9< - 60I - 73s - 115> - 62: - 58- - 45) - 41< - 60/ - 47I - 73s - 115
 - 13
 - 10    - 9< - 60A - 65n - 110> - 62: - 58- - 45O - 79< - 60/ - 47A - 65n - 110
 - 13
 - 10    - 9< - 60E - 69x - 120a - 97m - 109p - 112l - 108e - 101> - 62: - 58- -
 - 13
 - 13
 - 13
 - 10

我尝试使用setvbuf()在main()中禁用缓冲,但它根本没有给我任何好处。

以下是阅读和打印的文档,如果有帮助的话:

<Root>
    <Hello>World</Hello>
    <This>
    <Is>:-)</Is>
    <An>:-O</An>
    <Example>:-D</Example>
    </This>
</Root>

文件声明:extern uint8_t * document;

1 个答案:

答案 0 :(得分:1)

你需要摆脱回车(CR)字符(\r)。

输出CR时,ncurses会将光标重置为同一行中的第一列。然后,当您输出NL(\n)时,ncurses会在将光标前进到下一行之前从光标位置擦除到行尾。这有效地删除了刚打印的整行。

记录了这种行为,因为它的价值。来自man waddch(强调补充):

  

如果ch是制表符,换行符或退格键,则光标会在窗口中正确移动。退格键将光标向左移动一个字符;在窗口的左边缘它什么都不做。 换行执行clrtoeol ,然后将光标移动到下一行的窗口左边距,如果在最后一行则滚动窗口。标签被认为是每八列。可以通过设置TABSIZE变量来更改选项卡间隔。

对于回车的回复记录在PORTABILITY部分末尾的ncurses waddch联机帮助页中:

  

如果ch是回车符,则光标移动到窗口当前行的开头。其他实现也是如此,但没有记录。

(感谢Thomas Dickey指出PORTABILITY部分。)