c - 记住最后执行的命令的简单历史记录

标签 c arrays file-io char

我正在尝试用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/

相关文章:

c# - 序列化: Cannot convert type string[][] to string[]

python - 使用 Python 修改二进制文件

javascript - window.resolveLocalFileSystemURI 不是函数

arrays - 获取 N 项数组的所有 K 项组合的最短代码,其中 K <= N

c - 我正在创建一个函数来直接在 C 中创建节点。但是,我不知道如何实现节点的命名部分

c - libxml2 C 库 : SAX push parser context: xmlParseChunk error when passed null terminated string

c - 如何在 C 或 Assembly 中修改 Stack 上的返回地址

javascript - 从包含数组属性的基础对象有选择地创建一个新的对象数组

c++ - 如何通过 int-descriptor 找出文件名? (或 "can I..?")

c - 将局部变量的地址压入堆栈(程序集)的目的是什么