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$ 
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top