首先,我创建了两个带有ncurses的窗口:一个用于发送,另一个用于接收。基本上,一个用于编写命令,另一个用于打印命令。为了在接收窗口中写入输入,我做了一点功用,将已经在接收窗口中的字符串与用户编写的字符串连接起来(我认为问题出在这里)。
所以,当我运行代码时,程序失败并显示转储到wrefresh(winReception);
行的Segmentation Fault代码。>
但是奇怪的是,如果输入的字符数少于或等于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);
}
首先,我创建了两个带有ncurses的窗口:一个用于发送,另一个用于接收。基本上,一个用于编写命令,另一个用于打印命令。将输入写在...
如注释中所述,这里存在许多问题,但是主要的问题是wgetstr()
的使用完全不正确,因为它接受了用户的输入并将其填充到缓冲区中,但是您尚未分配缓冲区。我们不知道command
的值是什么,因此它会将数据存储到随机存储器中。