Вопрос

Я выполняю школьные задания.Написание простого интерпретатора командной строки.Одна из функций — очистка экрана.Он называется 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> в начало вашей программы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top