我發現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 –