我正在做学校作业。编写一个简单的命令行解释器。其中一个功能是清除屏幕。它叫做cmd_clr。为此,我尝试使用curses.h库中的clear()函数。问题是clear()由于某种原因返回-1值。这是代码:
#include <stdio.h> /* Standard IO functions */
#include <string.h> /* String library, might be useful */
#include <dirent.h> /* Directory entry API */
#include <curses.h> /* Useful for screen control */
#include <unistd.h> /* Process management API */
/* Global constants */
#define true 1
#define false 0
/* Global variables, structures */
char pwd[512];
char shell[512];
void cmd_dir(char []);
void cmd_cd(char []);
void cmd_clr(void);
int main (void)
{
char prompt[512] = {":#"};
char command[512];
char temp[512];
char* token;
while (true)
{
/* Print command prompot, including PWD */
printf("%s%s ", pwd, prompt);
/* Get command input */
gets(command);
/* Isolate the command token */
strcpy(temp, command);
token = strtok (temp, " ");
void cmd_dir(char directory[])
{
printf("shell command: dir\n");
token = strtok(NULL, " "); //to get the directory
execlp("/bin/ls","ls", "-l", token, NULL);
}
void cmd_cd(char directory[])
{
printf("shell command: cd\n");
token = strtok(NULL, " "); //to get the directory
chdir(token);
system("pwd");//to print the current directory
}
void cmd_clr(void)
{
printf("shell command: clr\n");
int tv = clear();
printf("%d", tv);
}
if (strcmp(token, "dir") == 0)
{
cmd_dir(command);
}
else if (strcmp(token, "cd") == 0)
{
cmd_cd(command);
}
else if (strcmp(token, "clr") == 0)
{
cmd_clr();
}
}
}
输出结果为:
mekhron@ubuntu:~/folder4$ gcc -o test test.c -lncurses
mekhron@ubuntu:~/folder4$ ./test
:# clr
shell command: clr
-1:# ^C
mekhron@ubuntu:~/folder4$
答案 0 :(得分:0)
与大多数clear()
函数一样,curses curses
函数在未事先调用initscr()
的情况下无法使用。
根据您的其余代码判断,您可能不想使用curses
或ncurses
。 curses
旨在管理整个屏幕。它与您正在执行的其他I / O不兼容。 curses
clear()
功能并不只是清除屏幕;它会清除屏幕状态的curses
内部表示。在您致电refresh()
之前,您的实际屏幕无法清除。
如果您只是想立即清除屏幕,您应该找到另一种方法。 clear
命令应该这样做;只需致电system("clear");
。
我需要指出的另一件事是:您正在使用gets()
功能。唐&#39;吨。 gets()
无法安全使用;因为它不允许你指定你正在读取的数组的大小,所以它不能阻止长输入行溢出你的数组并破坏其他内存。 fgets()
函数使用起来有点困难(特别是它会在数组中存储尾部'\n'
),但它可以安全使用。
假设您的编译器支持它,您可以删除false
和true
的定义,只需将#include <stdbool.h>
添加到程序的顶部。