根據tutorialsonpoint.com:
該
*getenv函式搜索名稱指向的環境字串 ,并將關聯的值回傳給該字串。
其中name是包含所請求變數名稱的 C 字串
該頁面在該描述之后提供了一個簡單的示例,但該示例并未逐步解釋此功能的實際作業原理。所以我在網上尋找這個函式的代碼,我設法得到了一個*getenv名為的函式的“副本” *_getenv,這里是:
char *_getenv(const char *name)
{
int i, j;
int status;
for (i = 0; environ[i] != NULL; i )
{
status = 1;
for (j = 0; environ[i][j] != '='; j )
{
if (name[j] != environ[i][j])
{
status = 0;
break;
}
}
if (status)
{
return (&environ[i][j 1]);
}
}
return (NULL);
}
getEnv = _getenv("PATH");
我知道該變數environ指向一個指向字串的指標陣列,稱為“環境”。此陣列中的最后一個指標的值為NULL。這意味著,在第一個 for 回圈中,此函式將遍歷陣列,直到找到NAME被呼叫的NULL
我不明白的是在第二個 for 回圈中發生了什么,要滿足的最終條件environ[i][j] != '='以及if 陳述句在哪里(&environ[i][j 1])回傳,我的意思是,為什么在回傳地址時將 1 添加到 j 計數器?
uj5u.com熱心網友回復:
在第二個 for 回圈中會發生什么,
該函式檢查之前的值=是否等于name。
name = "somevariable"
environ[i] = "somevariable=somevalue"
^^^^^^^^^^^^
^^^^^^^^^^^^ ----------- are these parts equal?
所以比較每個位元組name是否等于environ[i]up until environ[i][??] = '=',所以:
bool are_equal = true; // assume they are equal
for (j = 0; environ[i][j] != '='; j ) { // for each character in environ[i] up until equal sign
if (name[j] != environ[i][j]) { // check if bytes are equal
are_equal = false; // if they are not, we notify and break
break;
}
}
if (are_equal) { do_smthg() }
為什么回傳地址時 j 計數器加 1?
environ[i][j]指向'='.
environ[i] = "somevariable=somevalue"
^ ------------ [j]
^ ---------- [j 1]
我們要回傳指向值的指標,不包括=符號,因此函式回傳指向 的指標envron[i][j 1]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/368936.html
