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$ 
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top