سؤال
أنا أقوم بالواجبات المدرسية.كتابة مترجم سطر الأوامر بسيط.إحدى الوظائف هي مسح الشاشة.يطلق عليه 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>
إلى الجزء العلوي من البرنامج الخاص بك.