我正在尝试在c中模拟一个shell终端,其中一个功能是提供一个简单的内存来记住最后 命令执行。所以我要说的是:
如果用户输入" r" (命令==" 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正在创造问题。有人能帮助我吗?
答案 0 :(得分:1)
问题之一是你在返回之前不要终止你的数组。最后你需要cmd[i] = '\0'
之类的东西。
另一个更严重的问题是,您正在返回指向函数返回时被销毁的对象的指针。 cmd
对象具有自动存储功能,并在功能结束时被销毁。使用malloc
分配数组,或将指针作为getSavedFunction
的参数传递给数组。
答案 1 :(得分:0)
这个功能(加上命令行版本和其他一些好东西)是GNU readline
的全部要点(如果在Linux上,它可能是作为预构建的包提供的)或其BSD克隆{{3 (可能在BSD Unix上已经可用)。