2012-10-17 23 views
1

我在C中做了一个minishell,我的意思是我在考虑环境变量。我从用户处取出原始输入行,并将其传递给函数:我该如何处理我的迷你版中的空环境变量?

int expand(char *orig, char *new, int newsize) 

其中new是固定长度的char数组。我遍历orig直到找到$ {,然后使用getenv来查找变量的值。如果实际上有价值,我只需将其复制到新的。但是,如果没有值,我遇到了问题,getenv返回null。

我的老师告诉我只需插入一个空字符,然而这对我没有任何意义,我认为他的意思是不同的。如果我在orig中插入一个空字符,那么当我将它解析为参数时,它会认为空字符标记了字符串的结尾,并且不会打扰任何进一步的参数。

例如,如果我进入像这样一个会话:

echo ${USER} ${NOTHING} ${TERM} 

然后:

orig = "echo ${USER} ${NOTHING} ${TERM}\0" 

new = "echo my_user_name \0 xterm\0" 

输出将是:

my_user_name 

因为它会认为my_user_name是最后一个参数,因为在它能够将xterm读入参数列表之前有一个空终止符。

我知道这是一个模糊的问题,但我想你们中的一些人在制作迷你杯方面非常有经验,并且知道如何解决这个问题。

回答

1

也许他的意思是插入一个空字符串,即将该变量替换为空。这就是/ bin/sh所做的。

$ echo "hi $joe how are you" 
hi how are you 

空字符是一个与值0它通常写成'\0'。如你所知,它是C的字符串结束标记。

空字符串也称为空字符串。这是""。在C它是由一个长度为0,1字节的字符数组表示,如:

char str[1] = {'\0'}; 

但概念上它是不包含字符的唯一字符串。

个人而言,我更喜欢将其称为空字符串而不是空字符串。空是这样一个过度使用的词。空字符。空指针。

+0

他不是那个意思,因为如果你在UNIX shell中这样做,它不会有额外的空间。 我在说论前的参数列表。这只是将原始字符串处理为扩展字符串。用什么都替换变量将简单地忽略它存在的形式。 – robins35

+1

@Scriptonaut是的,从存在中忽略它是真实的壳做的。 –

+1

@Scriptonaut之所以有两个空格是因为双引号。 –

相关问题