Pergunta

Estou fazendo trabalhos escolares.Escrevendo um interpretador de linha de comando simples.Uma das funções é limpar a tela.É chamado cmd_clr.Para isso, estou tentando usar a função clear() da biblioteca Curs.h.O problema é que clear() retorna o valor -1, por algum motivo.Aqui está o código:

#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();
}



}
}

A saída é:

mekhron@ubuntu:~/folder4$ gcc -o test test.c -lncurses
mekhron@ubuntu:~/folder4$ ./test
:# clr
shell command: clr
-1:# ^C
mekhron@ubuntu:~/folder4$ 
Foi útil?

Solução

As maldições clear() função, como a maioria curses funções, não podem ser usadas sem primeiro chamar initscr().

A julgar pelo restante do seu código, você provavelmente não deseja usar curses ou ncurses de qualquer forma. curses foi projetado para gerenciar toda a tela.É incompatível com a outra E/S que você está fazendo.O curses clear() a função não apenas limpa a tela;isso limpa o curses representação interna do estado da sua tela.Sua tela real não será limpa até você ligar refresh().

Se você deseja apenas limpar a tela imediatamente, encontre outra maneira de fazer isso.O clear o comando deve fazer isso;apenas ligue system("clear");.

Mais uma coisa que preciso ressaltar:Você está usando o gets() função.Não. gets() não pode ser usado com segurança;como não permite especificar o tamanho do array no qual você está lendo, não pode impedir que uma longa linha de entrada transborde seu array e sobrecarregue outra memória.O fgets() função é um pouco mais difícil de usar (em particular, ela armazena o final '\n' em sua matriz), mas pode ser usado com segurança.

E supondo que seu compilador suporte isso, você pode descartar as definições de false e true e basta adicionar #include <stdbool.h> para o topo do seu programa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top