Функция Clear() в библиотеке Curs.h
Вопрос
Я выполняю школьные задания.Написание простого интерпретатора командной строки.Одна из функций — очистка экрана.Он называется cmd_clr.Для этого я пытаюсь использовать функциюclear() из библиотекиcurs.h.Проблема в том, что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$
Решение
Проклятия clear()
функция, как и большинство curses
функции, не могут быть использованы без предварительного вызова initscr()
.
Судя по остальной части вашего кода, вы, вероятно, не захотите использовать curses
или ncurses
в любом случае. curses
предназначен для управления всем экраном.Это несовместимо с другими операциями ввода-вывода, которые вы выполняете.А curses
clear()
функция не просто очищает экран;это очищает curses
внутреннее представление состояния вашего экрана.Ваш реальный экран не очистится, пока вы не позвоните. refresh()
.
Если вы просто хотите немедленно очистить экран, вам следует найти другой способ сделать это.А clear
команда должна это сделать;просто позвони system("clear");
.
Еще одна вещь, которую я должен отметить:Вы используете gets()
функция.Не. gets()
нельзя использовать безопасно;поскольку он не позволяет вам указать размер массива, в который вы читаете, он не может предотвратить переполнение массива длинной строкой ввода и засорение другой памяти.А fgets()
немного сложнее в использовании (в частности, она сохраняет конечные значения '\n'
в вашем массиве), но его можно безопасно использовать.
И если ваш компилятор поддерживает это, вы можете отказаться от определений false
и true
и просто добавь #include <stdbool.h>
в начало вашей программы.