Skip to content

1447: shell 模拟(20年期末机考T2)

题目

题目描述

题面

在 c++ 中,传统的命令行程序需要用户通过命令调用目标程序。接受用户命令并启动目标程序的中间程序称为 shell 。shell 需要完成的一个重要工作是解析输入字符串,并将其转变成标准参数格式以传入目标程序的 main 函数中。 main 函数的标准参数格式如下:

c++ int main(int argc,char** argv);

argc 代表参数个数, argv 指向一个长度为 argc 的指针数组,指针数组的每个元素指向一个字符串。

输入命令的参数以空格隔开,保证输入命令最后一个字符不是空格。

解释

ls -al /usr/bin

在此条命令中,argc = 3, argv[0] = "ls", argv[1] = "-al", argv[2] = "/usr/bin"

要求

我们已经为你写好了 shell 类,但 shell 类的正常工作依赖于 arguments 类,为此,请你实现 arguments 类的构造函数与析构函数,使 shell 类正常工作。

arguments 的构造函数负责解析 cmd ,并为 _argc_argv 赋上正确的值;析构函数负责避免内存泄漏。

  • 不允许使用给定头文件之外的头文件
  • 不允许增加/修改成员变量
  • 不需要修改 shell 类的实现
  • 可以添加合适的辅助函数

模板

```C++

include

include

include

include

include

// WARNING: NO more headers allowed!

using std::pair; using std::string; using std::vector; using std::map; using std::function; namespace final { class arguments { private: // WARNING: You cannot add more member variables. int _argc; char _argv; public: arguments() : _argc(0), _argv(nullptr) {} explicit arguments(const string& cmd) { // todo implement constructor } ~arguments() { // todo implement destructor } // WARNING: You cannot modify the following functions int argc() const { return _argc; } char argv() const { return _argv; } };

// You don't need to modify shell.
class shell {
private:
    map<int, arguments> running_list;
public:
    shell() = default;

    void run(int pid, const string& cmd, const function<void(int, char**)>& invoked) {
        running_list.emplace(pid, cmd);
        invoked(running_list[pid].argc(), running_list[pid].argv());
    }

    int subprocessExit(int pid, int return_value) {
        running_list.erase(pid);
        return return_value;
    }
    vector<int> getRunningList() const {
        vector<int> rt;
        for (auto& pair:running_list)rt.push_back(pair.first);
        return rt;
    }
};

} ```

样例输入

以下是一个样例评测程序

```c++

include

include "shell.hpp"

void print(int argc,char** argv){ for(int i=0;i<argc;++i) std::cout<<i<<": "<<argv[i]<<std::endl; } int main(){ final::shell shell; shell.run(0,"echo 'Hello,world'",print); shell.subprocessExit(0,0); return 0; } ```

样例输出

text 0: echo 1: 'Hello,world'

数据范围

  • 20% 测试点只需要 argc 正确
  • 60% 测试点需要 argcargv 均正确
  • 20% 测试点测试其它行为

评分:

  • 若程序正常退出且无内存泄漏,获得全部已获得分数
  • 若程序正常退出但发生内存泄漏,获得 80% 已获得分数
  • 若程序编译成功但发生 Runtime Error ,获得退出前 60% 已获得分数
  • 若程序无法通过编译,将无法获得分数

Oops! 本题目还没有解答!

助教老师们编题的速度,已经超过了解题的速度!

OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。

如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!