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% 测试点需要
argc
与argv
均正确 - 20% 测试点测试其它行为
评分:
- 若程序正常退出且无内存泄漏,获得全部已获得分数
- 若程序正常退出但发生内存泄漏,获得 80% 已获得分数
- 若程序编译成功但发生 Runtime Error ,获得退出前 60% 已获得分数
- 若程序无法通过编译,将无法获得分数
Oops! 本题目还没有解答!
助教老师们编题的速度,已经超过了解题的速度!
OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。
如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!