2012-10-01 110 views
0

我不是最好的指針,所以也許你可以看到我做錯了什麼。小strtok()樂趣

比方說,我有一個像這樣的初始化數組:

char *arrayOfCommands[]={"ls -l", "wc -l"}; 

我的目標是獲得一個數組稱爲的char * currentCommand了這陣,着眼於arrayOfCommands的和特定細胞的將命令分隔爲空格。

我的最終目標將是對每個循環新currentCommand陣列,每個看起來像這樣:

First Loop: 
currentCommand = [ls][-l] 

First Loop: 
currentCommand = [wc][-l] 

這裏是我的代碼至今:

for (i = 0; i < 2; ++i) { 
    char str[] = arrayOfCommands[i]; 
    char * currentCommand; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    currentCommand = strtok (str, " "); 
    while (currentCommand != NULL){ 
     printf ("%s\n",currentCommand); 
     currentCommand = strtok (NULL, " "); 
    } 

    . 
    . 
    . 

    //Use the currentCommand array (and be done with it) 
    //Return to top 
} 

任何幫助將非常感謝! :)

UPDATE:

for (i = 0; i < commands; ++i) { 
    char str[2]; 
    strncpy(str, arrayOfCommands[i], 2); 
    char *currentCommand[10]; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    currentCommand = strtok (str, DELIM); 
    while (currentCommand != NULL){ 
     printf ("%s\n",currentCommand); 
     currentCommand = strtok (NULL, DELIM); 
    } 
} 

我收到此錯誤:在分配**不兼容的類型**
它講的是 「海峽」 我傳遞的strtok功能。

+1

你確定'strtok()'是最好的選擇嗎?你有沒有考慮過使用'strcspn()'或'strpbrk()'或類似的東西? 'strtok()'是一個危險的函數。如果你在庫函數中使用它,你必須證明你這麼做是因爲使用它會給任何在使用'strtok()'時調用你的函數的人造成嚴重破壞。而且你還必須小心,不要因爲同樣的原因調用任何使用'strtok()'的函數。一般來說,除非有一位老師將你的雙手握在火焰中並強迫你將它們留在那裏,否則請避開'strtok()'尋找'strtok_r()'。 –

+0

什麼'char str [] = arrayOfCommands [i];'是什麼意思? –

+0

你似乎在幾個地方混合了字符串,char數組和指針數組。也許作爲第一步,您可以編寫一些只需要一個命令字符串並將其解析爲一個令牌數組的東西。做一個函數,現在你可以調用'arrayOfCommands []'中的每個項目。第二個想法是,第一步是在嘗試構建一組令牌之前,在單獨的行上打印每個令牌。 –

回答

2

strtok通過修改您傳遞的字符串進行操作;使用某些手冊頁時很容易錯過。數組中的每個命令都是一個文字字符串:嘗試修改它們會導致問題。因此,在與strtok一起使用前,您需要製作每個命令的副本

此外,這是對陣列的無效初始化:

char str[] = arrayOfCommands[i]; 

聲明str作爲一些固定尺寸的陣列,然後用strncpy使用strtok標記化之前使每一個命令的副本:

char str[MAX_COMMAND_LEN + 1]; 
strncpy(str, arrayOfCommands[i], MAX_COMMAND_LEN); 

// ... 
+0

容易錯過?始終閱讀BUGS部分。 http://www.kernel.org/doc/man-pages/online/pages/man3/strtok.3.html#bugs – 2012-10-01 01:48:49

+0

@VladLazarenko這只是一個例子。並非每個手冊頁都有該部分。 – pb2q

+1

strncpy與UNIX目錄條目一起使用,這些條目是14位數組,必須是nul-padded而不是nul-terminated。對於其他任何東西都不是正確的解決方案,因爲它1)NUL焊盤,這是不必要的,並且2)不能NUL終止,這導致了UB。 –