我正在尝试用c语言模拟shell终端,其中一个功能是提供一个简单的内存来记住执行的最后命令。所以我的做法是:
- 每次用户输入命令(字符串)时,该字符串都会保存在文件 (command_histroy.txt) 中
如果用户输入“r”(command==“r”),终端将调用函数getSavedCommand(),因为我只保存一个命令,所以我的函数是:
char* getSavedCommand(void){ char cmd[1000]; int i=0; char* filename = "files/command_history.txt"; FILE* file = fopen(filename,"r"); if(file!=NULL){ int c; do{ c = fgetc(file); cmd[i]=c; i++; } while (c != EOF); }else{ puts("Error Reading file"); } return cmd; }
因此,在文件“command_history.txt”中,只存储了一行,我重新假设它将在字符数组中返回这一行。为了测试我打印了结果:
cmd = getSavedCommand();
printf("|%s|",cmd);
我得到的结果是:
arj@arj-Inspiron-1545:~/projet$ ./a.out
|ls -l /home/arj
�|
arj@arj-Inspiron-1545:~/projet$
我想要的是:
|ls -l /home/arj|
我认为 EOF 造成了问题。有人可以帮助我吗?
最佳答案
问题之一是您在返回之前没有以 null 终止数组。最后需要类似 cmd[i] = '\0'
的内容。
一个更严重的问题是您返回一个指向对象的指针,该对象在函数返回时被销毁。 cmd
对象具有自动存储功能,并在函数结束时被销毁。使用 malloc
分配数组,或将指向数组的指针作为 getSavedFunction
的参数传递。
关于c - 记住最后执行的命令的简单历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23170466/