2011-11-09 104 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:只有您*复制*令牌。你可以自由地检查它并决定忽略它。无论如何,除非字符串处理是您的核心程序活动,否则这可能不是最大的担心。 –

相关问题