Fonction Clear() dans les malédictions.h bibliothèque
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$
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.