Función Clear() en la biblioteca curses.h
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$
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.