Clear () Funktion in Flüchen.h Bibliothek
Frage
Ich mache Schulaufgaben.Schreiben eines einfachen Befehlszeileninterpreters.Eine der Funktionen ist das Löschen des Bildschirms.Es heißt cmd_clr .Dafür versuche ich, die clear () -Funktion von Flüchen zu verwenden.h Bibliothek.Das Problem ist, dass clear() aus irgendeinem Grund den Wert -1 zurückgibt.Hier ist der 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();
}
}
}
Die Ausgabe ist:
mekhron@ubuntu:~/folder4$ gcc -o test test.c -lncurses
mekhron@ubuntu:~/folder4$ ./test
:# clr
shell command: clr
-1:# ^C
mekhron@ubuntu:~/folder4$
Lösung
Fluch clear()
funktion, wie die meisten curses
funktionen, die ohne vorherigen Aufruf nicht verwendet werden können initscr()
.
Nach dem Rest Ihres Codes zu urteilen, möchten Sie wahrscheinlich nicht verwenden curses
oder ncurses
Wie dem auch sei. curses
wurde entwickelt, um Ihren gesamten Bildschirm zu verwalten.Es ist nicht kompatibel mit den anderen E / A, die Sie ausführen.Der curses
clear()
funktion löscht nicht nur den Bildschirm;es löscht die curses
interne Darstellung des Zustands Ihres Bildschirms.Ihr tatsächlicher Bildschirm wird erst gelöscht, wenn Sie anrufen refresh()
.
Wenn Sie den Bildschirm nur sofort löschen möchten, sollten Sie einen anderen Weg finden, dies zu tun.Der clear
befehl sollte es tun;rufen Sie einfach an system("clear");
.
Noch eine Sache, auf die ich hinweisen muss:Sie verwenden die gets()
Funktion.Tu es nicht. gets()
kann nicht sicher verwendet werden;da Sie die Größe des Arrays, in das Sie lesen, nicht angeben können, kann es nicht verhindern, dass eine lange Eingabezeile Ihr Array überläuft und anderen Speicher überlastet.Der fgets()
funktion ist etwas schwieriger zu bedienen (insbesondere speichert sie das nachgestellte '\n'
in Ihrem Array), aber es kann sicher verwendet werden.
Und vorausgesetzt, Ihr Compiler unterstützt es, können Sie die Definitionen von löschen false
und true
und füge einfach hinzu #include <stdbool.h>
an die Spitze Ihres Programms.