Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用c+制作外壳+;,尝试创建shell变量_C++_C_Shell_Variables_Unix - Fatal编程技术网

C++ 用c+制作外壳+;,尝试创建shell变量

C++ 用c+制作外壳+;,尝试创建shell变量,c++,c,shell,variables,unix,C++,C,Shell,Variables,Unix,所以我有一个相对简单的shell,它处理管道、chdir、重定向和运行程序。但是我需要一种实现shell变量的方法,就像在普通shell中一样(例如HELLO=world) intmain() { while(true) { 字符串结果; 字符*左[128]; 字符*右[128]; 你需要三样东西: 解析输入行中的变量赋值 解析输入行中的变量引用,替换为值 变量名和值的存储 如何做到后者有无限的可能性 单个动态字符数组,所有变量存储在一个字符串中,使用您选择的魔法字符分隔条目:FOO=FO

所以我有一个相对简单的shell,它处理管道、chdir、重定向和运行程序。但是我需要一种实现shell变量的方法,就像在普通shell中一样(例如HELLO=world)

intmain()
{
while(true)
{
字符串结果;
字符*左[128];
字符*右[128];
你需要三样东西:

  • 解析输入行中的变量赋值
  • 解析输入行中的变量引用,替换为值
  • 变量名和值的存储
如何做到后者有无限的可能性

  • 单个动态字符数组,所有变量存储在一个字符串中,使用您选择的魔法字符分隔条目:
    FOO=FOO#BAR=baz#SPAM=eggs
    。按条目数缩放O(n)
  • 包含变量名和值的字符指针对的动态数组。比例为O(n)
  • 链表,您可以在其中按排序方式插入上面的对。如果您使用二进制搜索进行插入和查找,则缩放O(对数n)
  • 上述对的二叉树,如果不平衡,则在O(logn)和O(n)之间缩放
  • 哈希表。比例为0(1)
  • 等等等等等等

对于动态数组,我的意思是插入时总是
realloc
整个过程。

如果要在shell中存储变量,应该查看stdlib中的getenv()和setenv()

这避免了在STL中使用C/C++程序中的存储

setenv("variablename", "value", 1);
如果当前变量存在,则1将为其启用覆盖

setenv("HELLO", "world", 1);
您还可以使用

char *value = getenv("variablename");
您不需要动态分配值


注释:这些值持续存在模拟shell的程序的生命,此后,它们不再存在。

存储,标准库中的<代码> map < /C> >是C++中的无选择的选择,是的,我承认我从未在C++中考虑过)——除非你有特殊的理由否则,很明显的地方可能是<代码> ST。d::map
std::unordered_map
。shell变量和环境变量之间有细微的区别。环境变量由子进程继承,而shell变量则不是。请参阅bash中的
导出
char *value = getenv("variablename");