1

这是我的 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 说 document 的内容如下:

$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;

4

1 回答 1

1

您需要去掉回车 (CR) 字符 ( \r)。

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

这种行为被记录在案,因为它的价值。来自man waddch(强调添加):

如果ch是制表符、换行符或退格,则光标在窗口内适当移动。Backspace 将光标向左移动一个字符;在窗口的左边缘它什么也不做。 Newline 执行 aclrtoeol,然后将光标移动到下一行的窗口左边距,如果在最后一行则滚动窗口。选项卡被认为位于每八列。可以通过设置TABSIZE变量来更改制表符间隔。

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

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

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

于 2015-05-13T17:46:59.950 回答