我知道,对于应该在堆栈溢出上发布的内容来说,这是一个有点离题的话题,但我想知道这些示例是否做得很好。
setenv:
手册页- setenv
包括: #include <stdlib.h>
声明: int setenv(const char *v_name, const char *v_value, int overwrite);
返回:如果成功返回零,则返回-1,并将errno设置为指示错误的原因。
getenv:
手册页- getenv
包括: #include <stdlib.h>
declaration: char *getenv(const char *name)
返回:如果成功返回指向环境中值的指针,则返回;如果没有匹配,则返回NULL。
示例
在以下示例中,char *ppath用作变量。
示例1:这个示例显示了当overwrite参数为非零且v_name有一个值时会发生什么。
ppath = getenv("PWD"); //puts the environment of $PWD into ppath
if(ppath == NULL) //error checking
perror("getenv");
cout << "$PWD = " << ppath << endl; //prints the environment of $PWD 此代码的输出为$PWD = /class/classes/username/CS100,这是因为char变量ppath从getenv("PWD")获取环境,而$PWD的环境是/class/classes/username/CS100。因此,ppath指向该环境。还有正确的错误检查,以确保$PWD具有一个环境,如果没有,则调用perror。
ppath = getenv("HOME"); //gets the environment of the $HOME
if(ppath == NULL) //error checking
perror("getenv");
cout << "$HOME = " << ppath << endl; //prints the environment of $PWD此代码的输出为$HOME = /class/classes/username,这是因为char变量ppath从getenv("HOME")获取环境,而$HOME的环境是/class/classes/username。因此,ppath指向该环境。还有正确的错误检查,以确保$HOME具有一个环境,如果没有,则调用perror。
if(-1==setenv("PWD",ppath,1)) //since the overwrite parameter is non-zero it replaces environment
perror("setenv"); //of $PWD with the value of ppath which is defined by the environment
//of $HOME这是为了改变$PWD的环境,在这种情况下,它采用ppath所指向的值,在本例中是/class/classes/username,也是$HOME。overwrite参数是非零的,因此它将$PWD的环境替换为ppath。
ppath = getenv("PWD"); //gets the environment of $PWD
if(ppath == NULL) //error checking
perror("getenv");
cout << "$PWD = " << ppath << endl; //the value should now be the same as the value of $HOME此代码的输出为$PWD = /class/classes/username,这是因为char变量ppath从getenv("PWD")获取环境,而$PWD的环境是/class/classes/username。因此,ppath指向该环境。还有正确的错误检查,以确保$PWD具有一个环境,如果没有,则调用perror。示例1的完整输出如下。
产出1:
$PWD = /class/classes/username/CS100
$HOME = /class/classes/username
$PWD = /class/classes/username示例2:这个例子显示了当overwrite参数为非零且v_name有一个空值时会发生什么,就像在v_name = ""中,所以是空字符串。
ppath = getenv("PWD");
if(ppath == NULL)
perror("getenv");
cout << "$PWD = " << ppath << endl; //in this case ppath ="" because the environment of $PWD is not set以下代码的输出将是$PWD = --这是因为$PWD的环境被设置为"" --在本例中,它使ppath指向一个空字符串。因此,它不抛出错误的原因是,如果$PWD是一个未定义的变量,则调用perror。
ppath = getenv("HOME");
if(ppath == NULL)
perror("getenv");
cout << "$HOME = " << ppath << endl;输出:这个代码是$HOME = /class/classes/username,这是因为char变量ppath从getenv("HOME")获取环境,$HOME的环境是/class/classes/username。因此,ppath指向该环境。还有正确的错误检查,以确保$HOME具有一个环境,如果没有,则调用perror。
if(-1==setenv("PWD",ppath,1)) //since the overwrite parameter is non-zero it replaces environment
perror("setenv"); //of $PWD with the value of ppath which is defined by the environment
//of $HOME 由于overwrite参数为1,所以与前面示例中定义的$PWD设置为ppath无关。
ppath = getenv("PWD");
if(ppath == NULL)
perror("getenv");
cout << "$PWD = " << ppath << endl; //the value should now be the same as the value of $HOME以下代码的输出为$PWD = /class/classes/username --这是因为setenv将过去代码块中定义的$PWD值更改为ppath。
产出2:
$PWD =
$HOME = /class/classes/username
$PWD = /class/classes/username示例3:这个示例显示了当overwrite参数为零而v_name有一个值时会发生什么。
ppath = getenv("PWD");
if(ppath == NULL)
perror("getenv");
cout << "$PWD = " << ppath << endl;在本例中,ppath设置为$PWD环境。此代码块的输出为$PWD = /class/classes/username/CS100。
ppath = getenv("HOME");
if(ppath == NULL)
perror("getenv");
cout << "$HOME = " << ppath << endl;在此代码块中,ppath设置为$HOME环境。以下代码块的输出将是$HOME = /class/classes/username。
if(-1==setenv("PWD",ppath,0)) //since the overwrite parameter is zero it does not replaces
perror("setenv"); //environment of $PWD with ppath.这里有一个新的情况,即overwrite参数为零。在这种情况下,什么是ppath并不重要,因为零标志使得$PWD不会被ppath替换,除非$PWD是一个未定义的变量,在这种情况下,$PWD将被赋予ppath的值。
ppath = getenv("PWD");
if(ppath == NULL)
perror("getenv");
cout << "$PWD = " << ppath << endl; //the value should not be changed.此代码块的输出为$PWD = /class/classes/username/CS100。这是因为setenv没有因为overwrite参数而改变$PWD的环境。
产出3:
$PWD = /class/classes/username/CS100
$HOME = /class/classes/username
$PWD = /class/classes/username/CS100示例4:这个示例显示了当overwrite参数为零或非零且v_name是环境中未定义的参数时会发生什么。
ppath = getenv("HOME");
if(ppath == NULL)
perror("getenv");
cout << "$HOME = " << ppath << endl;在这种情况下,给出了$HOME的环境,并进行了适当的错误检查。代码块的输出是$HOME = /class/classes/username。
if(-1==setenv("random_name",ppath,0)) //since the overwrite parameter is zero and the variable
perror("setenv"); //$random_name is undefined, setenv makes the environment of
//$random_variable is the value of ppath. If the case where
//there is a undefined variable the setenv behaves the
//same way regardless of a non-zero or zero overwrites parameter. 在这种情况下,overwrite参数仍然是零,但是没有声明v_name,所以在这里,零的overwrite参数是有用的。在本例中,random_name被设置为ppath,它指向$HOME的环境,即/class/classes/username。
ppath = getenv("random_name"); //gets the value of $PWD
if(ppath == NULL)
perror("getenv");
cout << "$random_name = " << ppath << endl; //the value should now be the same as the value of $HOMEppath包含$random_name的环境,该环境由setenv在前一个代码块中设置。此代码块的输出为$random_name = /class/classes/username。
产出4:
$HOME = /class/classes/username
$random_name = /class/classes/username发布于 2015-06-11 06:30:26
您正在使用C++;您可以在编写时轻松地声明变量。实际上,C99和C11都允许您在使用变量时声明它们。
示例1
示例1:这个示例显示了当覆盖参数为非零且v_name有一个值时会发生什么。
实际上,很难在示例1中发现与overwrite参数有任何关系的代码。
ppath = getenv("PWD");//将$PWD的环境放入ppath ( ppath == NULL) //错误检查perror("getenv");cout << "$PWD =“<< ppath << endl;//打印$PWD环境。
当您确定ppath为NULL时,不应该使用它;这是一个普遍的问题。现在,既然这是nullptr,你不应该使用C++吗?我认为这可能是:
const char *ppath = getenv("PWD");
if (ppath == nullptr)
perror("getenv");
else
cout << "$PWD = " << ppath << endl;如果您说编码是为了向后兼容性,那么使用NULL或0代替nullptr没有什么大问题。
实际上,您有三次几乎相同的代码块;您需要编写一个函数:
void show_env(const char *varname)
{
const char *ppath = getenv(varname);
if (ppath == nullptr)
perror("getenv");
else
cout << "$" << varname << " = " << ppath << endl;
}这是对原始代码的直接音译。它还说明了为什么perror()是一个糟糕的函数;很难使错误消息有意义(它不包括变量名)。此外,getenv()的POSIX规范没有指定errno是由getenv()设置的,我们应该将代码修改为:
void show_env(const char *varname)
{
const char *ppath = getenv(varname);
if (ppath == nullptr)
cerr << "No value in the environment for $" << varname << endl;
else
cout << "$" << varname << " = " << ppath << endl;
}然后你可以打电话给:
show_env("PWD");
show_env("HOME");
…code using setenv()…
show_env("PWD");等。我不相信引用$HOME的代码是相关的;您实际上没有使用它。
就我个人而言,我非常不喜欢你在setenv()代码中使用的背对头比较风格。当尤达想说…的时候
请注意,仅设置环境变量$PWD并不会更改当前工作目录。
示例2
示例2没有清楚地显示将v_name设置为空字符串。但是,这是setenv()的POSIX规范所涵盖的情况。这一次定义了一个错误(errno将被设置为EINVAL)。
重复的代码太多了,很难发现什么是有趣的。
示例3
你说:
示例3:这个示例显示了当
overwrite参数为零而v_name有一个值时会发生什么。
我想你是说:
示例3:这个示例显示了当
overwrite参数为零且由v_name标识的环境变量有一个值时会发生什么。
这可能以前也适用。
例4
你说:
ppath = getenv("random_name");//获取$PWD的值
注释与代码不匹配。
风格化
您应该为每个示例创建一个以###作为行前缀的标题。您可能有也可能没有一个超级标题## Examples。您可以模仿函数大纲的手册页面的样式,也可以简单地省略除概要之外的所有内容,这是指函数行为定义的位置。
正如所写的,很难找到这4个例子(在回答的过程中,我才意识到有四个例子,而不是三个)。你有很多重复。您也有大量的噪声(引用$HOME的代码基本上是噪声。
https://stackoverflow.com/questions/30772027
复制相似问题