0

我发现 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 如何通过静态内存存储该字符串有关吗?

4

1 回答 1

2

阅读手册:该strtok函数更改原始字符串并用空字节覆盖分隔符。字符串的其余部分不会“变为空字符串”,但您必须在最后找到的令牌之后恢复字符串的其余部分。

最好strtok习惯性地使用来提取所有标记,然后单独处理这些标记。

于 2011-11-09T00:15:22.777 回答