我发现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如何通过静态内存存储该字符串有关?
我发现那个主题作为我的guess.strtok使用相同的内存位置。因此在split_redirect函数中的下一个strtok调用将覆盖相同内存位置中的字符串。 http://stackoverflow.com/questions/1509654/using-strtok-in-a-loop-in-c –