Question

Je suis en train de faire des travaux scolaires.L'écriture d'un simple interpréteur de ligne de commande.L'une des fonctions est de vider l'écran.Sa s'appelle cmd_clr.Pour cela, je vais essayer d'utiliser la fonction clear() de malédictions.h la bibliothèque.Le problème est clair() renvoie la valeur -1, pour une raison quelconque.Voici le code:

#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 sortie est:

mekhron@ubuntu:~/folder4$ gcc -o test test.c -lncurses
mekhron@ubuntu:~/folder4$ ./test
:# clr
shell command: clr
-1:# ^C
mekhron@ubuntu:~/folder4$ 
Était-ce utile?

La solution

Les malédictions clear() fonction, comme la plupart des curses fonctions, ne peut pas être utilisé sans appeler initscr().

À en juger par le reste de votre code, vous ne voulez probablement pas à être l'aide curses ou ncurses de toute façon. curses est conçu pour gérer la totalité de votre écran.Il est incompatible avec les autres I/O que vous faites.L' curses clear() la fonction n'est pas juste effacer l'écran;il efface le curses la représentation interne de l'état de votre écran.Votre écran ne sera pas désactivée jusqu'à ce que vous appelez refresh().

Si vous voulez juste pour effacer l'écran immédiatement, vous devez trouver un autre moyen de le faire.L' clear commande devrait le faire;appelez simplement system("clear");.

Une chose que je besoin de souligner:Vous êtes à l'aide de la gets() fonction.Ne le faites pas. gets() ne peut pas être utilisé en toute sécurité;car il ne vous permet pas de spécifier la taille du tableau dans lequel vous êtes en train de lire, il ne peut empêcher une longue ligne d'entrée de déborder de votre tableau et casser les autres de la mémoire.L' fgets() la fonction est un peu plus difficile à utiliser (en particulier, il stocke la fuite '\n' dans votre tableau), mais il peut être utilisé en toute sécurité.

Et en supposant que votre compilateur prend en charge, vous pouvez déposer les définitions de false et true et juste ajouter #include <stdbool.h> vers le haut de votre programme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top