2011-11-09 106 views
0

我發現strtok的功能有一定的訣竅時,你傳遞相同的字符串到另一個函數,代碼如下:strtok的字符串,並將它傳遞給另一個函數

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

void split_redirect(char input[80], int switch_bit); 
void split_background(char *split_cmd); 

void split_background(char *split_cmd){ 

    char *tmp = strchr(split_cmd, '&'); 
    if (tmp == NULL){ } 
    else{ 
     char *command = strtok(split_cmd,"&");   
     while(command!=NULL){   
      // char *command_next = strtok(NULL,"&"); 
      printf("command=[%s]\n",command); 

      if((strchr(command,'>')!=NULL)||(strchr(command,'<')!=NULL)){ 
       split_redirect(command,0);    
      } 
      // command = command_next; 
      command = strtok(NULL,"&"); 
      printf("command_next=[%s]\n",command);  
     } 
    } 
} 

void split_redirect(char input[80], int switch_bit){ 
    char *tmp ,*tmp2; 
    tmp = strchr(input, '>'); 
    tmp2 = strchr(input, '<'); 

    if (tmp == NULL && tmp2 == NULL){ } 
    else if(tmp2 == NULL && tmp !=NULL){ 
    // single > 
     char *copy = (char *)malloc(sizeof(input)); 
     strcpy(copy,input); 
     char *tmp = strtok(copy,">"); 
     char *cmd = tmp; 
     tmp = strtok(NULL,"\0"); 

     if (strchr(tmp,'>')==NULL){ 
      char *file_name = strtok(tmp," "); 
     } 
     else{ 
      free(copy); 
      copy=NULL;    
     } 
    } 
    else{ } 
} 

void main(int argc,char *argv[]){ 
    // char *cmd2 = "cmd1 > txt & cmd2 > txt2" // -> each char can't be change, so strotk this string will get seg fault. Modify token to '\0' is illegal. in .RDATA 
    char cmd[80] = "cmd1 > txt & cmd2 > txt &"; 
    split_background(cmd); 
} 


Expect output: 
command=[cmd1 > txt ] 
command_next=[ cmd2 > txt ] 

The output: 
command=[cmd1 > txt ] 
command_next=[(null)] 

爲什麼當我將這個字符串傳遞給另一個函數會導致其餘的字符串變成空字符串?當我取消char *command_next = strtok(NULL,"&");並將command = strtok(NULL,"&");替換爲command = command_next;時,它會按照我的預期打印字符串的其餘部分。它與strtok如何通過靜態內存存儲該字符串有關?

+0

我發現那個主題作爲我的guess.strtok使用相同的內存位置。因此在split_redirect函數中的下一個strtok調用將覆蓋相同內存位置中的字符串。 http://stackoverflow.com/questions/1509654/using-strtok-in-a-loop-in-c –

回答

2

閱讀the manualstrtok函數更改原始字符串並用空字節覆蓋分隔符字符。該字符串的其餘部分不會「變爲空字符串」,但必須在最後一個找到的標記之後繼續字符串的其餘部分。

可能最好使用strtok通俗地提取所有標記,然後分別處理這些標記。

+0

+1,迷死 – logancautrell

+0

「這可能是最好用的strtok慣用提取所有標記,然後分別處理這些令牌「。 - >當然,這是一個風險較小的方式來處理這個問題,但多一點內存使用。 –

+0

@Akaing:只有您*複製*令牌。你可以自由地檢查它並決定忽略它。無論如何,除非字符串處理是您的核心程序活動,否則這可能不是最大的擔心。 –

相關問題