سؤال

أنا أقوم بالواجبات المدرسية.كتابة مترجم سطر الأوامر بسيط.إحدى الوظائف هي مسح الشاشة.يطلق عليه cmd_clr.لذلك، أحاول استخدام وظيفة Clear() من مكتبة curs.h.المشكلة هي أن Clear() تُرجع قيمة -1 لسبب ما.هنا هو الرمز:

#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();
}



}
}

الإخراج هو:

mekhron@ubuntu:~/folder4$ gcc -o test test.c -lncurses
mekhron@ubuntu:~/folder4$ ./test
:# clr
shell command: clr
-1:# ^C
mekhron@ubuntu:~/folder4$ 
هل كانت مفيدة؟

المحلول

اللعنات clear() وظيفة، مثل معظم curses الوظائف، لا يمكن استخدامها دون الاتصال الأول initscr().

إذا حكمنا من خلال بقية التعليمات البرمجية الخاصة بك، فمن المحتمل أنك لا تريد استخدامها curses أو ncurses على أي حال. curses تم تصميمه لإدارة شاشتك بأكملها.إنه غير متوافق مع عمليات الإدخال/الإخراج الأخرى التي تقوم بها.ال curses clear() الوظيفة لا تقوم فقط بمسح الشاشة؛فإنه يمسح curses التمثيل الداخلي لحالة شاشتك.لن يتم مسح شاشتك الفعلية حتى تتصل refresh().

إذا كنت تريد فقط مسح الشاشة فورًا، فيجب أن تجد طريقة أخرى للقيام بذلك.ال clear الأمر يجب أن يفعل ذلك؛اتصل وحسب system("clear");.

هناك شيء آخر يجب أن أشير إليه:أنت تستخدم gets() وظيفة.لا. gets() لا يمكن استخدامها بأمان.نظرًا لأنه لا يسمح لك بتحديد حجم المصفوفة التي تقرأ فيها، فإنه لا يمكنه منع سطر إدخال طويل من تجاوز المصفوفة الخاصة بك والضغط على الذاكرة الأخرى.ال fgets() يعد استخدام الوظيفة أكثر صعوبة قليلاً (على وجه الخصوص، فهي تقوم بتخزين الملف الزائد '\n' في الصفيف الخاص بك)، ولكن يمكن استخدامه بأمان.

وبافتراض أن المترجم الخاص بك يدعمه، يمكنك إسقاط تعريفات false و true وأضف فقط #include <stdbool.h> إلى الجزء العلوي من البرنامج الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top