2010-09-26 51 views
0

我試圖創建一個表示存儲在PATH變量中的目錄的字符串數組。我正在用C編寫這段代碼,但是我無法使內存分配部分工作。令牌化一個環境變量並將結果標記保存爲char **

char* shell_path = getenv ("PATH"); 
char* tok = strtok (shell_path, SHELL_PATH_SEPARATOR); 
int number_of_tokens = 0, i = 0; 

while (tok != NULL) 
{ 
    number_of_tokens++; 
} 

Shell_Path_Directories = malloc (/* This is where I need some help */); 
shell_path = getenv ("PATH"); 
tok = strtok (shell_path, SHELL_PATH_SEPARATOR); 
while (tok != NULL) 
{ 
    Shell_Path_Directories[i++] = tok; 
    tok = strtok (NULL, SHELL_PATH_SEPARATOR); 
} 

我遇到的問題是,我想不出我怎麼才能知道究竟有多少內存來分配。

我知道我將字符串兩次標記爲字符串,這對我來說可能是愚蠢的,但如果有人能找到更好的方法來做到這一點,我願意改進。

回答

1

只給你基本相同的答案user411313在不同的方言:

char* shell_path = getenv ("PATH"); 

/* Copy the environment string */ 
size_t const len = strlen(shell_path)+1; 
char *copyenv = memcpy(malloc(len), shell_path, len); 

/* start the tokenization */ 
char *p=strtok(copyenv,SHELL_PATH_SEPARATOR); 
/* the path should always contain at least one element */ 
assert(p); 

char **result = malloc(sizeof result[0]); 
int i = 0; 

while (1) 
{ 
    result[i] = strcpy(malloc(strlen(p)+1), p); 
    p=strtok(0,SHELL_PATH_SEPARATOR); 
    if (!p) break; 
    ++i; 
    result = realloc(result, (i+1)*sizeof*result); 
} 
+0

這段代碼大部分是正確的。 在realloc中它應該是(i + 1)而不是簡單的i。 除了這個答案我覺得是以最好的方式回答我的問題的答案。 非常感謝。 – 2010-09-28 05:57:20

+0

@Varun:哎呀,糾正。 – 2010-09-28 07:51:28

1

你可以這樣做:

Shell_Path_Directories = malloc (sizeof(char*) * number_of_tokens); 

而且你指望的number_of_tokens的方式不正確。您需要再次調用strtok在循環傳遞NULL作爲第一參數:

while (tok != NULL) { 
    number_of_tokens++; 
    tok = strtok (NULL, SHELL_PATH_SEPARATOR); 

} 
+0

呀,這僅僅是一個錯誤的編輯代碼,使其適合在這裏顯示,當我做了。不過謝謝。 – 2010-09-28 06:00:00

0

既然你已經算令牌的數量已經,您可以使用它作爲指針的數量爲char分配:

char **Shell_Path_Directories = malloc(number_of_tokens * sizeof(char *)); 

然後你有一個更小問題:您正在使用strtok直接由getenv返回的字符串,從而導致未定義行爲(strtok修改你傳遞給它的字符串,而你不許修改由getenv返回的字符串,以便獲取undefi ned行爲)。您可能首先需要複製字符串,然後標記您的副本。

0

你不應該改變getenv返回指針,更安全的做一個副本。使用strtok你可以銷燬你的環境表的內容。

char* shell_path = getenv ("PATH"); 
char *p,*copyenv = strcpy(malloc(strlen(shell_path)+1), shell_path); 
char **result = 0; 
int i = 0; 
for(p=strtok(copyenv,SHELL_PATH_SEPARATOR); p; p=strtok(0,SHELL_PATH_SEPARATOR)) 
{ 
    result = realloc(result, ++i*sizeof*result); 
    strcpy(result[i-1]=malloc(strlen(p)+1), p); 
} 
+1

+1表示您可以分離'result'數組和複製的字符串的分配問題。 -1,因爲在'i'上有副作用,你可以簡單地選擇它作爲循環變量。 – 2010-09-26 08:31:55