- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我使用 ncurses 创建两个窗口:一个用于传输,一个用于接收。基本上,一个用于编写命令,另一个用于打印命令。为了在接收窗口中写入输入,我做了一个小函数来连接接收窗口中已有的字符串和用户编写的字符串(我认为问题就在那里)。
因此,当我运行代码时,程序失败并显示在 wrefresh(winReception);
行转储的段错误代码
但奇怪的是,如果输入的字符数为 7 个或更少,则可以正常工作,如果输入的字符数为 8 或更多,则无法正常工作。
屏幕截图:https://imgur.com/a/zEwBs1k
这是一些代码:
//Global variables
WINDOW * winReception;
WINDOW * winTransmission;
char * command;
char mesg[] = "Enter a command";
//variable to stock the input in reception window
char *textinwindow = "";
//main
int main(int argc, char* argv[])
{
initscr();
/* WINDOW RECEPTION */
winReception = newwin(15, 0, 0, 0);
wrefresh(winReception);
/* WINDOW TRANSMISSION*/
winTransmission= newwin(8, 0, 15, 0);
wrefresh(winTransmission);
mvwprintw(winTransmission, 1, 2, mesg);
wgetstr(winTransmission, &command);
verifInput(&command);
free(textinwindow);
exit(0);
}
//concat function (where I think the bug is)
char* concat(char *s1, char *s2)
{
char *result = (char *) malloc(strlen(s1) + strlen(s2) + 1);
strcpy(result, s1);
strcat(result, "\n ");
strcat(result, s2);
return result;
}
//verifInput (where the program fails)
void verifInput (char* cmd)
{
/* WINDOW RECEPTION */
textinwindow = concat(textinwindow, cmd);
mvwprintw(winReception, 1, 2, textinwindow);
wrefresh(winReception);
/* WINDOW TRANSMISSION*/
touchwin(winTransmission);
wclear(winTransmission);
wrefresh(winTransmission); //Program fails here
mvwprintw(winTransmission, 1, 2, mesg);
wgetstr(winTransmission, &command);
verifInput(&command);
}
最佳答案
如评论中所述,这里存在许多问题,但主要的问题是 wgetstr()
的使用完全错误,因为它接受用户的输入并将其填充到缓冲区中,但你还没有分配缓冲区。我们不知道 command
的值是什么,因此它将数据存储到随机内存中。
解决此问题的错误方法是:
char command[256];
wgetstr(winTransmission, command); // NO
因为虽然您提供了一个存储用户输入的位置,但 wgetstr()
不知道缓冲区有多大,如果用户输入太多,它就会覆盖内存也在那里。不好。
相反,我们将使用带有缓冲区和计数的有界版本wgetnstr()
char command[256];
wgetnstr(winTransmission, command, sizeof command); // YES
现在它永远不会覆盖缓冲区!
其他问题:虽然您在代码末尾释放了 textinwindow
内存,但每次调用 concat()
时,旧的 textinwindow
的值(也分配了内存)被丢弃。这肯定是内存泄漏。
最后,一个微妙的问题。由于 mvwprintw()
采用 printf 样式格式字符串,因此您传递给它的值来自用户,并且可能包含 %s
标记。这不会带来任何好处。相反:
mvwprintw(winReception, 1, 2, "%s", textinwindow);
这意味着用户输入字符串中的任何时髦 %
都不会造成严重破坏。
这是我想到的:
#include <stdio.h>
#include <ncurses.h>
#include <string.h>
#include <stdlib.h>
//Global variables
WINDOW * winReception;
WINDOW * winTransmission;
char command[256];
const char mesg[] = "Enter a command";
//variable to stock the input in reception window
char *textinwindow = 0;
void verifInput (const char* cmd);
//main
int main(int argc, char* argv[])
{
initscr();
/* WINDOW RECEPTION */
winReception = newwin(15, 0, 0, 0);
wrefresh(winReception);
/* WINDOW TRANSMISSION*/
winTransmission= newwin(8, 0, 15, 0);
wrefresh(winTransmission);
mvwprintw(winTransmission, 1, 2, mesg);
wgetnstr(winTransmission, command, sizeof command);
verifInput(command);
free(textinwindow);
exit(0);
}
//concat function (where I think the bug is)
char* concat(const char *s1, const char *s2)
{
// 2 = newline + space
// 1 = final NUL byte
char *result = (char *) malloc(strlen(s1) + 2 + strlen(s2) + 1);
strcpy(result, s1);
strcat(result, "\n ");
strcat(result, s2);
return result;
}
//verifInput (where the program fails)
void verifInput (const char* cmd)
{
// free up old memory except for the first time
if (textinwindow == 0)
textinwindow = concat("", cmd);
else
{
char *save = textinwindow;
textinwindow = concat(textinwindow, cmd);
free(save);
}
/* WINDOW RECEPTION */
mvwprintw(winReception, 1, 2, "%s", textinwindow);
wrefresh(winReception);
/* WINDOW TRANSMISSION*/
touchwin(winTransmission);
wclear(winTransmission);
wrefresh(winTransmission); //Program fails here
mvwprintw(winTransmission, 1, 2, mesg);
wgetnstr(winTransmission, command, sizeof command);
verifInput(command);
}
关于c - 在 C 中使用 ncurses 的 wrefresh 函数时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58793504/
我正在用 C 和 C++ 编写 ncurses 程序。我还没有找到向用户隐藏光标的方法。我在互联网上查了一下,但我发现的大多数信息要么涉及 (n)curses 的 Python/Ruby 实现,要么实
我有我的 window WINDOW *win = newwin(40, 40, 3, 3); 当输入一些文本并跨越更多行时,保留窗口内边框周围整齐空白的最佳方法是什么?我似乎找不到在 NCurses
我使用 ncurses 创建了一个单窗口菜单方案并让它运行起来。当我添加第二个窗口时,我无法再触发我的 wgetch 调用(或者看起来是这样)。 函数原型(prototype)让我有些困惑: int
我一直在测试 ncurses,我尝试使用 Windows 编写一个简单的代码,通过阅读教程中的代码,在我看来,如果仅对一个窗口进行更改,调用 wrefresh() 就足够了。所以我尝试了以下代码,但它
我是一名初学者 C 程序员,我的一项任务要求我为 Logo 编程语言编写一个解释器。为此,我想知道是否有可能在使用 ncurses 库时将屏幕拆分,以便一半保留具有常规文本输入/输出的基本终端属性,另
在 ncurses 中捕获 control+key 的正确方法是什么? 当前我正在这样做定义控制,如下所示: #define ctl(x) ((x) & 0x1f) 它工作正常,但问题是我不能同时捕捉
有没有办法在mvwprintw中使用ANSI转义码? mvwprintw(window, 0, 0,"%c[%dmCOLORED_TEXT!\n", 0x1B, 32);//doesn't work
我以前问过这样的问题,但它有点误导,因为我没有包括打印顺序。自从我了解了整个概念的变化后,我认为再问一次会更合适。 #include using namespace std; in
我对 ncurses 比较陌生,只是想知道在我开始的 ncurses TUI 中显示在终端/命令行中执行的命令输出的简单方法是什么。即像这样的伪代码(我知道它不起作用,只是为了得到重点:)目标是呈现一
我正在使用 ncurses 在 C 中创建一个基于控制台的应用程序,它接受单个键输入但也读取组合键。例如,当用户同时按下 S 键和 F 键时,我希望它运行一些功能。是否有一些像 getch() 这样的
我试图通过将值 COLOR_BLUE 设置为 rgb 值(1000, 0, 0)来将文本 block 的背景设置为红色。如果我使用 Gnome 的“终端”应用程序,背景是正确的(红色),但如果我使用
main :: IO() main = runCurses $ do setEcho False w ev == EventCharacter 'q' || ev == EventChara
我需要使用 ncurses 实现一个简单的文本阅读器,有点像 unix 的 less。 我在理解如何操作时遇到问题。我目前有一个窗口,每次我按下向下键(例如)时,我都会在适当的起点刷新所有行,给人一种
为什么这段代码在这里: #include #define WIN 5 #define WI win[0] #define WC win[1] int ymax, xmax; WINDOW *win[
我正在使用 ncurses 构建我自己的终端。我的主窗口包含 5 个其他窗口。我位于下面的窗口是提示面板。我希望在那里输入文本,并且我也希望能够在那里输入文本。我已使用 wmove 定位光标,但光标仍
我正在尝试使用 ncurses 库在屏幕的特定点上色。 我写了这段代码: #include int main(void) { initscr(); start_color();
我正在使用 ncurses 为我的应用程序制作一个简单的 TUI。我掌握了创建和打印到窗口的基础知识,但我在输入方面遇到问题。 当我写完的时候,光标定位在我写的字符串的末尾 但是当我开始打字时,光标会
我有一个基本的 Linux 发行版,运行在一台连接激光的机器上。我想开发一个界面,它允许我: 配置激光设置(例如工具栏和按钮) 显示激光的当前路径(例如图形窗口) 因为这些是最基本的机器,所以我没有安
平台:Linux 3.2.0 x86 (Debian Wheezy) 编译器:GCC 4.7.2 (Debian 4.7.2-5) 我正在编写一个需要 ncurses 提供的高级终端控制的程序,但我无
我一直在尝试自学 ncurses,到目前为止我很喜欢它。但是,我正在尝试编写一个像 pico 或 nano 这样的小型文本编辑器。到目前为止,我已经设置得相当好。我创建了一个函数来映射键。无论我做什么
我是一名优秀的程序员,十分优秀!