Funzione Clear() nella libreria curses.h
Domanda
Sto facendo i compiti scolastici.Scrivere un semplice interprete della riga di comando.Una delle funzioni è cancellare lo schermo.Si chiama cmd_clr.Per questo, sto provando a utilizzare la funzione clear() dalla libreria curses.h.Il problema è che clear() restituisce il valore -1, per qualche motivo.Ecco il codice:
#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();
}
}
}
L'output è:
mekhron@ubuntu:~/folder4$ gcc -o test test.c -lncurses
mekhron@ubuntu:~/folder4$ ./test
:# clr
shell command: clr
-1:# ^C
mekhron@ubuntu:~/folder4$
Soluzione
Le maledizioni clear()
funzione, come la maggior parte curses
funzioni, non possono essere utilizzate senza prima chiamare initscr()
.
A giudicare dal resto del tuo codice, probabilmente non vorrai usarlo curses
O ncurses
Comunque. curses
è progettato per gestire l'intero schermo.È incompatibile con gli altri I/O che stai eseguendo.IL curses
clear()
la funzione non si limita a pulire lo schermo;cancella il curses
rappresentazione interna dello stato dello schermo.Lo schermo reale non verrà cancellato finché non chiamerai refresh()
.
Se vuoi semplicemente cancellare immediatamente lo schermo, dovresti trovare un altro modo per farlo.IL clear
il comando dovrebbe farlo;chiama soltanto system("clear");
.
Un'altra cosa che devo sottolineare:Stai utilizzando il gets()
funzione.Non. gets()
non può essere utilizzato in modo sicuro;poiché non ti consente di specificare la dimensione dell'array in cui stai leggendo, non può impedire che una lunga riga di input trabocchi l'array e ostruisca altra memoria.IL fgets()
la funzione è un po' più difficile da usare (in particolare memorizza il file trailing '\n'
nel tuo array), ma può essere utilizzato in sicurezza.
E supponendo che il tuo compilatore lo supporti, puoi eliminare le definizioni di false
E true
e basta aggiungere #include <stdbool.h>
all'inizio del tuo programma.