Pregunta

Estoy haciendo tareas escolares.Escribir un intérprete de línea de comando simple.Una de las funciones es borrar la pantalla.Se llama cmd_clr.Para eso, estoy intentando usar la función clear() de la biblioteca curses.h.El problema es que clear() devuelve un valor -1, por alguna razón.Aquí está el 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();
}



}
}

La salida es:

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

Solución

las maldiciones clear() funcionar, como la mayoría curses funciones, no se pueden utilizar sin llamar primero initscr().

A juzgar por el resto de tu código, probablemente no quieras usar curses o ncurses de todos modos. curses está diseñado para administrar toda la pantalla.Es incompatible con las otras E/S que estás realizando.El curses clear() La función no solo borra la pantalla;se borra el curses representación interna del estado de su pantalla.Tu pantalla real no se borrará hasta que llames refresh().

Si sólo desea borrar la pantalla inmediatamente, debería buscar otra forma de hacerlo.El clear el comando debería hacerlo;solo llama system("clear");.

Una cosa más que necesito señalar:Estás usando el gets() función.No. gets() no se puede utilizar de forma segura;dado que no le permite especificar el tamaño de la matriz en la que está leyendo, no puede evitar que una línea de entrada larga desborde su matriz y afecte a otra memoria.El fgets() La función es un poco más difícil de usar (en particular, almacena el final '\n' en su matriz), pero se puede utilizar de forma segura.

Y suponiendo que su compilador lo admita, puede eliminar las definiciones de false y true y solo agrega #include <stdbool.h> al principio de su programa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top